p35 @字符串
在字符串之前加上一个@
,可以保持原生字符,不用再进行转义(除了双引号)。
例如:
@"A short list:
item 1
item 2"
或者:
@"C:\Temp\MyDir\MyFile.doc"
这相当于"C:\\Temp\\MyDir\\MyFile.doc"
。
p41 using static
可以使用using static System.Console
来将静态成员直接包含到作用域中。
这样访问WriteLine()
方法就不用再加上静态类名了。
p71 typeof 运算符
typeof
运算符可以得到操作数的类型。
例如:
string myString = "north";
orientation myDirection = (orientation)Enum.Parse(typeof(orientation), myString);
p80 数组问号
int?[] myIntArray = new int?[7] {5, intValue, 9, 10, null, 2, 99};
注意紧跟在int
声明之后的问号?
。问号旨在让编译器直到这个int[]
数组可以包含空对象,若没有这个问号,就会显示编译异常。
其次,要注意在初始化一个整数时,通常将其默认设置为0。
p80多维数组
二维数组格式:
int[,] intArray;
多维数组格式:
int[,,,] intArray;
初始化:
double[,] hillHeight = new double[3,4];
也可以用字面值进行初始赋值:
double[,] hillHeight = {{1,2,3,4}, {2,3,4,5}, {3,4,5,6}};
访问:
double[,] hillHeight = {{1,2,3,4}, {2,3,4,5}, {3,4,5,6}};
foreach (double height in hillHeight){Console.WriteLine($"{height}");
}
hillHeight[0,0]
hillHeight[0,1]
hillHeight[0,2]
...
hillHeight[1,2]
这种数组叫做矩形数组,因为每一行的元素个数都相同。
还有一种锯齿数组(jagged array),详情见p82。
p98 ref和out
ref关键字可用于返回类型和入参类型。
使用例子:
- 首选在函数形参处指定ref
static void ShowDouble(ref int val) {val*=2;Conosole.WriteLine($"val doubled = {val}"); }
- 在函数调用时需要再次指定(这是必需的)
int myNumber = 5; Console.WriteLine($"myNumber = {myNumber}"); ShowDouble(ref myNumber); Console.WriteLine($"myNumber = {myNumber}");
ref必须在外部初始化,C#不允许假定ref参数在使用它的函数中初始化。
也就是说下面的用法是非法的:
int muNumber;
ShowDouble(ref myNumber);
Console.WriteLine($"myNumber = {myNumber}");
除了ref外,还要out关键字。
使用out关键字时,必须把它看成尚未赋值。
调用函数时会丢弃out中存储的值。
例子:
static int MaxValue(int[] intArray, out int maxIndex)
{int maxVal = intArray[0];maxIndex = 0;for(int i=1, i<intArray.Length; ++i){if(intArray[i] > maxVal){maxVal = intArray[i];maxIndex = i;}}return maxVal;
}
使用该函数:
int[] myArray = {1,2,2,,1,332,22,12211};
Console.WriteLine("maximum value" + $"{MaxValue(myArray, out int maxIndex)}");
Console.WriteLine("The first occurrence of this value is " + $"at element {maxIndex + 1}");
p100 元组
示例:
var numbers = {1,2,3,4,5};
上面代码创建了一个名为numbers的元组,其中包含成员Item1、Item2、Item3、Item4和Item5。
可以以下面的方式来访问这些成员:
var number = numbers.Item1;
还可以给成员指定特定的名称来明确标识:
(int one, int two, int three, int four, int five)nums = {1,2,3,4,5};
int first = nums.one;
p135 双问号空值合并操作符
friend ?? throw new ArgumentNullException(paraName: nameof(friend), message: "null")
上面的带使用了双问号(??
),称为空值合并操作符(null-coalescing operator),检查所赋的值是否为null,若为null,则抛出ArgumentNullException
函数;否则将该值赋给变量。
双问号(??)是一个单元运算符,其左右两边数据类型必须是相同类型或能隐形转换类型的。意思是,首先检测左边的值,若为Null,那么整个表达式取值为右侧的值,否则为左侧的值。
例如:
string s = null; Console.Write(s ?? "abc");
。将打印出"abc"。
例如:string s = "a"; Console.Write(s ?? "abc");
将打印出"a"。