实例化使用new关键字把该引用存储在堆上的一个对象
一、类型推断使用var关键字。
int somenumber=0;就变成var somenumber=0;即使somenumber没有声明为int,编译器也可以确定,只要在其作用域内就是一个int。
var name = "ddd"; var age = 22; var isRabbit = true; Type nameType = name.GetType(); Type ageType=age.GetType(); Type isRabbitType = isRabbit.GetType(); Console.WriteLine(nameType.ToString()); Console.WriteLine(ageType.ToString()); Console.WriteLine(isRabbit.ToString()); Console.ReadLine(); return 0;
system.string
system.int32
system.boolean
变量必须初始化否则,编译器就没有推断变量类型的依据。
初始化器不能为空。
初始化器必须放在表达式中。
不能把初始化器设置为一个对象,除非在初始化器中创建了一个新的对象。
1、变量是类或结构中的字段,如果没有显示初始化,创建这些变量的时候,其默认值就是0.
2、方法的局部变量必须在代码中显示初始化,之后才能在语句中使用它们的值。此时初始化不是在声明该变量的时候进行的,但编译器会通过方法检查所有可能的路径,如果检测
到局部变量在初始化之前就使用了它的值,就会产生错误。
二、变量作用域
字段和局部变量的作用域冲突。某些情况下,可以区分名称相同、作用域相同的两个标识符。此时编译器允许声明第二个变量。变量之间有一个最基本的区分。
它把在类型级别声明的变量看做字段,,而把在方法中声明的变量看做局部变量。
三、常量
常量是其值在使用过程中不会发生变化的变量。在变量前面加上一个const,就可以把该变量指定为一个常量。
1、常量必须在声明时对其初始化。指定了其值后就不能再改写了。
2、常量的值必须能在编译时用于计算,因此不能从一个变量中提取的值来初始化常量。如果需要这样做应使用只读字段。
3、常量总是静态的。但注意不必(实际上,是不允许)在常量声明中包含修饰符static。
四、预定义数据类型。
一、值类型和引用类型
区别是值类型直接存储其值,而引用类型存储其值的引用。这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。
复制引用修改会变,值则不会。
血 是值类
型,这表示下面的语句会在 内 存的两个地方存储值 ⒛:
// i and j are both of type int
i=20;
j=i
`
但考虑下面的 代码。 这段代码假定已 经定义了 一个类 Vector,Vector是 一个引用类型,它有一个int类型的成员变量value
Vector x,y;
x=new Vector();
x.value=30;
y=x;
console.writeline(y.value);
y.value=50;
console.WriteLine(x.value)
要理 解的 重要一点 是在 执行这段代码后,只 有一个 Vector对 象。 x和 y都 指向 包含该对象的内 存
位置。 因 为x和 y是 引 用类型的 变量,声 明 这两个变量只保留了 一 个引 用 一而 不会实例化给定 类型
的 对象。 两种青 况下都不会真正创建对象。 要创建对象,就必须使 用 new关 键字,如上所示。因 为x
和y引 用同一个 对象,所 以 对 x的 修改 会影响y,反 之亦然。因 此上面的 代码会显示 30和 50。
如果变量是一个引用,就可以把其值设置为null,表示不引用任何对象
如果要把自己的类型定义为值类型就应把它声明为一个结构
bool,long都是值类型,如果声明一个bool变量,并给它赋予另一个布尔变量的值,在内存中就会有两个bool值,修改第一个,第二个也不会改变
y=null;
二、cts类型
C#认可的基本预定义类型并没有内置于C#中,而是内置于framework中。在C#中声明一个int类型的数据,声明其实是.net结构system.int32的一个实例。
这表示在语法上,可以把所有的基本数据类型看做是支持某些方法的类。例如把int转换为string tostring()。
2、string类型是引用类型分配在堆上而不是栈上,当把一个字符串赋给另一个字符串时,会得到对内存中同一个字符串的两个引用,string与其他引用类型有区别
字符串是不可改变的,修改一个字符串就会创建一个全新的对象,而另一个字符串不发生任何变化
1 using System 2 class StingExample 3 { 4 public static int Main() 5 { 6 string s1 = "a string"; 7 string s2 = s1; 8 Console.WriteLine("s1 is "+s1); 9 Console.WriteLine("s2 is " +s2); 10 s1 = "another string"; 11 Console.WriteLine("s1 is now " + s1); 12 Console.WriteLine("s2 is now " + s2); 13 Console.ReadLine(); 14 return 0; 15 } 16 }
输出结果为:a string
a string
another string
a string
运算重载的原因
2.4流控制
case值必须是常量表达式,不允许使用变量
在语法上把枚举当成结构是不会造成性能损失,一旦代码编译好枚举就会成为基本类型与int ,float等类似
1 public enum TimeOfDay 2 { 3 Moring=0, 4 Afternoon=1, 5 Evening=2 6 } 7 public static int Main() 8 { 9 TimeOfDay time = TimeOfDay.Afternoon; 10 Console.WriteLine(time); 11 Console.ReadLine(); 12 return 0; 13 }
Afternoon
TimeOfDay time2 = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine((int)time2);
从字符串中获取枚举值,Enum.Parse返回一个对象引用,我们需要把字符串显示转换为需要的枚举类型(这是一个拆箱的例子)返回1
public enum TimeOfDay { Moring=0, Afternoon=1, Evening=2 } public static int Main() { TimeOfDay time = TimeOfDay.Afternoon; Console.WriteLine((int)time); TimeOfDay time2 = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine(time2); Console.ReadLine(); return 0; }
这个例子输出的结果为1,Afternoon
public enum TimeOfDay { Moring=0, Afternoon=1, Evening=2 } public static int Main() { TimeOfDay time = TimeOfDay.Afternoon; Console.WriteLine(time); int time2 = (int)Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine(time2); Console.ReadLine(); return 0; }
结果为afternoon,1
using System; using Introduction = Wrox.ProCsharp.Basics; class Test { public static int Main() { Introduction::NamespaceExample NsEx = new Wrox.ProCsharp.Basics.NamespaceExample(); Console.WriteLine(NsEx); Console.ReadLine(); return 0; } } namespace Wrox.ProCsharp.Basics { class NamespaceExample { public string GetNamespace() { return this.GetType().Namespace; } } }
名称空间别名的修饰符是“::”
xml文档
可以把xml文档从代码中提取出来
2.11预处理指令
浙公网安备 33010602011771号