1. 值类型和引用类型

1.1 值类型

比如int,float,struct等,和C/C++中的变量差不多,但编译器会强制你必须先初始化再使用,避免一不小心使用了未初始化的变量。

1.2 引用类型

class是引用类型,其默认行为类似于引用或指针(?但可以通过重载函数改变其默认行为?)。

注:尽管教科书上一般将class归为引用类型,但我倾向于将它们看作指针类型,一方面是因为它们的行为更像是指针,另一方面是便于与函数引用参数ref区分开。

比如你定义了一个class MyClass,现在想要一个MyClass类型的变量,那么必须这样:

MyClass myClass = new MyClass();

而不能简单地MyClass myclass完事。

又如语句MyClass anotherMyClass = myClass,其效果等价于指针赋值。

1.3 总结

不管是值类型还是引用类型,编译器都强制必须先初始化后使用,因此在定义和初始化上两者并无明显区别。它们的主要区别在于赋值运算符和函数参数传递时。

2. 变量初始化

因为编译器强制变量必须初始化后再使用,因此如下代码是无法通过编译的:

int i;
if(condition) {
i = ;
}
Console.WriteLine(i);

由于condition的不确定,编译器无法确认i是否得到了初始化。但下面代码可以:

int i;
if(true) {
i = ;
}
Console.WriteLine(i);

上面的代码中,编译器可以确定i得到了初始化。类似下面的代码也是可以的:

int i;
for(;;)
{
i = ;
 break;
}
Console.WriteLine(i);

P.S. 因为这个强制初始化要求,所以函数参数必须能够具备out属性用于传递一个未经初始化的变量,以避免不必要的初始化。

又P.S. 从上面代码中可以看出,圣书《C#入门经典》关于for循环体中变量作用域的解释并不正确,至少第五版是如此。书中那段不能通过编译的代码,主要原因是编译器无法确认for循环是否一定执行(尽管程序员可以确认),也就无法确认变量是否在for循环中得到了初始化,而不是因为书中那段估计作者自己都看不明白的解释(中文版第五版,正文p123-124)。

3. 数组

3.1 如上所述,数组也必须初始化后再使用,例如int[] array = new int[3]。但是可以省略数组每个元素的初始化:编译器会将它们初始化为默认值。

3.2 多维数组

其含义等价于C语言的多维数组,但语法不同,例如int[,] array = new int[3,4]。

3.3 数组的数组

数组的数组可以理解为指针数组,数组的每个元素都是个“指针”,指向另一个数组。所以初始化也分两级。例如:

int[][] array = new int[][] { new int[3], new int[4] };

4. 函数参数

void test(MyClass myClass)
{
myClass.dosomething();
myClass = new MyClass();
} void test(ref MyClass myClass)
{
myCLass.dosomething();
myClass = new MyClass();
}

如上文所述,class的行为像指针。所以形参myClass上的dosomething()是作用于实参上的。非ref参数的test函数中,myClass=new MyClass()会覆盖形参但不会影响实参;而ref参数的test函数中,myClass=new MyClass()会同时覆盖掉实参。

5. 委托

简单情况下,委托的定义类似于class,使用起来类似于函数指针。

// 1. 定义一个委托“类”
// 下面这条语句一般位于那些可用来放置class定义的地方
delegate void MyDelegate();
// 2. 声明(并在需要时初始化)一个委托“类”的实例
MyDelegate myDelegate = MyFunction;
// 3. 使用该“类”的实例:通过委托调用函数
myDelegate();

6. virtual、override和new

如果你想要多态,在基类中使用virtual,在继承类中使用override;

如果你想要重新实现,在继承类中使用new。

7. 属性

举个栗子:很多论坛对长贴提供直接输入分页进行跳转的功能,基于C/C++/C#程序员的骄傲,在代码内部分页总是从0开始计数,但显示值总是从1开始计数:

class MyClass
{
private int _page;
public int page
{
get
{
return _page + ;
}
set
{
_page = value - ;
}
}
}

属性功能上类似于下面代码,但让你可以用访问成员变量的语法去访问属性。

// C#伪代码
public int get_page()
{
return _page + ;
}
public void set_page(int value)
{
// value实际上是C#关键字,
// 在set方法中使用。
_page = value - ;
}

C#语法杂谈的更多相关文章

  1. WPF 杂谈——开篇简言。

    这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感 ...

  2. Java 语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...

  3. 杂谈---小故事小道理,面试中的小技巧(NO.2)

    本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...

  4. WPF 杂谈——开篇简言

    这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感 ...

  5. 让你看不懂的swift语法

    一.Swift杂谈 Swift语法出来时间不长,网络上的各种教程已经铺天盖地,可是基本上全部的教程都是来自官方翻译. 从Swift出来到如今.每天都在学习Swift.以下给出个人感受 Swift中的非 ...

  6. ~Delphi const 杂谈~

    来自:http://www.cnblogs.com/tibetwolf/articles/1785744.html ------------------------------------------ ...

  7. KVM&Libvirt基本概念及开发杂谈

    导读 大家好,本次肖力分享的主题是KVM&Libvirt基本概念及开发杂谈,内容有些凌乱松散,主要基于自己早期整理的笔记内容和实践感悟,有些内容难免有失偏颇,望见谅.前面先介绍下需要了解的基本 ...

  8. ES6深入浅出-2 新版函数:箭头函数 2 视频-2.视频 箭头函数杂谈

    杂谈coffeescript 箭头函数抄的是谁? coffeescript 双箭头的形式 箭头函数简洁的语法 数组内每一个值都平方一下 Map的写法 箭头函数的写法 平方后,每一个值再加1 numbe ...

  9. 不吹不黑,跨平台框架AspNetCore开发实践杂谈

    前言 最近边学边做,初步上手了AspNetCore的开发,对MVC这套熟悉了一下,因为之前没有拿来做过独立项目,都是和别人合作开发,所以前后端分离,我都只做WebApi,而且还是很小的项目(课设级别) ...

随机推荐

  1. java 读取文件的常用方式

    1.读取: public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void rea ...

  2. Python 结巴分词

    今天的任务是对txt文本进行分词,有幸了解到"结巴"中文分词,其愿景是做最好的Python中文分词组件.有兴趣的朋友请点这里. jieba支持三种分词模式: *精确模式,试图将句子 ...

  3. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  4. Java BigInteger(大数,ACM比赛专用)

    用c或者C++处理大数比较麻烦,于是决心学习一下JAVA中大数运算. 先下载一个eclipse,具体的用法去问度娘吧 JAVA中有两个类BigInteger和BigDecimal分别表示大整数类和大浮 ...

  5. 设置drawable图片

    google官方建议在textView和imageView挨着的时候,建议使用drawable来显示图片 第一个方法:setCompoundDrawablesWithIntrinsicBounds(D ...

  6. SAP保存操作记录CDHDR和CDPOS表

    http://blog.sina.com.cn/s/blog_7dce1fac01014yp2.html转自sap的字段和对象的修改都会保存旧值,数据保存在CDHDR和CDPOS表中,提取旧值可以采用 ...

  7. ZOJ 1216 Deck

    原题链接 题目大意:1/2+1/4+1/6+…1/n 解法:直接累加即可. 参考代码: #include<stdio.h> int main(){ printf("# Cards ...

  8. php部分---面向对象,设计模式(单例模式、工厂模式)、oop六大原则;

    一.单例模式目的:为了控制对象的数量(只能够有一个,相当于类的计划生育)做法1.将类的构造函数做成私有的2.在类里面做了一个公有的函数来造对象3.将该函数变为静态的4.在函数里面加控制 class R ...

  9. bootstrap部分---网格系统;(几天没写博客了,为了潜心研究一下bootstrap)

    1工作原理: (1)行必须放置在 .container class 内,以便获得适当的对齐(alignment)和内边距(padding). (2)使用行来创建列的水平组. (3)内容应该放置在列内, ...

  10. XML的解析方式(DOM、SAX、StAX)

    (新)  XML的解析方式(DOM.SAX.StAX) 博客分类: XML   一般来说,解析XML文件存在着两种方式,一种是event-based API,比如说象SAX,XNI. 第二种是tree ...