首页 > 代码库 > C#学习笔记1
C#学习笔记1
1.该属性允许访问在启动当前进程时在命令行上指定的程序名和任何参数。程序名可以(但不是必须)包含路径信息。 使用 Environment.GetCommandLineArgs()方法可检索在字符串数组中分析和存储的命令行信息。
string cmd = Environment.CommandLine;
Console.WriteLine(cmd);
2.decimal类型和C#的浮点类型的区别在于,decimal类型的基数是十进制的,浮点类型的基数是二进制的。一个decimal要表示成±N×10k(k次方,-28<=k<=0),其中N是96bit的一个正整数。而一个浮点数是±N×2k(k次方)的任意数,其中N是用固定数量(float是24,double是53)的bit表示一个正整数,k是-149~+104(float)或者-1075~+970(double)的任何整数。
3.所有的string类型的数据,不管是不是字符串字面量,都是不可变的(或者说是不可修改的),例如,你不可能将字符串“Come As You Are”更改为“Come As You Age”。也就是说,你不能修改变量最初引用的数据,只能重新对变量进行赋值,让它指向内存中的一个新位置。
(1)可以在一个字符串前面使用@符号,指明转义序列不被处理,这样生成结果是一个逐字字符串字面量,它不仅将反斜杠当作普通字符处理,而且还会逐字解释说有空白字符。
(2)输出新的一行所需的字符,要使用“\r\n”这两个字符组合,也可以使用Environment.NewLine。
Console.WriteLine(@"begin
/\
/ \
/ /______end");
4.char支持4种格式的赋值,char 可以隐式转换为 ushort、int、uint、long、ulong、float、double 或 decimal。 但是,不存在从其他类型到 char 类型的隐式转换。
char[] chars = new char[4];
chars[0] = ‘X‘; // 字符文字
chars[1] = ‘\x0058‘; // 十六进制
chars[2] = (char)88; // 数字转化
chars[3] = ‘\u0058‘; // Unicode
foreach (char c in chars)
{
Console.Write(c + " ");
}
Console.WriteLine((ushort)‘\x0020‘);
Console.WriteLine(0x2A); //在表示16进制的数字中,需要‘0x’作为前缀
Console.WriteLine("0x{0:X}", 42); //使用x或X代表把一个10进制数转换乘16进制,大小写决定了十六进制的显示字母的大小形式
Console.WriteLine("\0,N"); //“\0”代表Null
5.在.Net2.0中,可以使用default()运算符来判断一种数据类型的默认值。
6.数组分为普通(一维)数组,多维数组,交错数组(可变数组,即数组的数组,交错数组要求为内部的每个数组都创建一个数组实例),其声明方式如下。
(1)使用Length返回数组元素的总数,因此,如果你有一个多维数组,比如大小为2x3x3的cells[,,]数组,那么Length会返回元素总数18。可使用Rank确认数组的维度,可使用GetLength(int)确认某维度的元素总数。
(2)在使用Array.BinarySearch()方法之前,有必要对数组进行排序,如果值不升序进行排序,会返回不正确的索引。
(3)Array.Clear()方法不会删除数组的元素,而且不将长度设为零。数组大小是固定的不能修改,所以Clear()方法将数组中的每个元素都设为其类型的默认值(false、0。null)。
string[] language = { "C#", "COBOL", "Java", "C++", "Visual Basic", "Pascal", "Fortran", "Lisp", "J#" };
int[,] cells = { { 1, 0, 2 }, { 1, 2, 0 }, { 1, 2, 1 } };
int[][] cells2 = new int[4][] { new int[4], new int[3], new int[2], new int[1] };
Array.Sort(language);
string searchString = "COBOL";
int index = Array.BinarySearch(language, searchString);
Console.WriteLine("The wave of the future, {0}, is at index {1}.", searchString, index);
Console.WriteLine();
Console.WriteLine("{0,-20}{1,-20}", "First Element", "Last Element");
Console.WriteLine("{0,-20}{1,-20}", "-------------", "------------");
Console.WriteLine("{0,-20}{1,-20}", language[0], language[language.Length - 1]);
Array.Reverse(language);
Console.WriteLine("{0,-20}{1,-20}", language[0], language[language.Length - 1]);
Array.Clear(language, 0, language.Length);
Console.WriteLine("{0,-20}{1,-20}", language[0], language[language.Length - 1]);
Console.WriteLine("After clearing, the array size is: {0}", language.Length);
Trace.Assert(4.2f != 4.2); // Trace类提供一组方法和属性,帮助您跟踪代码的执行
7.goto 语句:其将程序控制直接传递给标记语句。
(1)goto 的一个通常用法是将控制传递给特定的 switch-case 标签或 switch 语句中的默认标签。
(2)goto 语句还用于跳出深嵌套循环。
注意:虽然也可以在switch语句之外使用 goto ,但它们通常会造成较差的程序结构,应该用一种更容易懂的结构采取代它,还要注意的是,不能用 goto 语句从switch 语旬的外部跳到switch语句内部的一个标签。一般来说,C#禁止goto到某个东西里面,只尤许它在某个东西的内即使用,或者用于跳出某个东西。通过这个限制,C#避免了在其他语言中可能遇到的大多数滥用goto的情况.
static void TestGoto()
{
Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large");
Console.Write("Please enter your selection: ");
int n = Console.Read();
int cost = 0;
switch (n)
{
case 1:
cost += 25;
break;
case 2:
cost += 25;
goto case 1;
case 3:
cost += 50;
goto case 1;
default:
Console.WriteLine("Invalid selection.");
break;
}
if (cost != 0)
{
Console.WriteLine("Please insert {0} cents.", cost);
}
Console.WriteLine("Thank you for your business.");
Console.WriteLine("Press any key to exit.");
}
static void TestGoto2()
{
int x = 200, y = 4;
int count = 0;
string[,] array = new string[x, y];
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
array[i, j] = (++count).ToString();
Console.Write("Enter the number to search for: ");
string myNumber = Console.ReadLine();
for (int i = 0; i < x; i++)
for (int j = 0; j < y; j++)
if (array[i, j].Equals(myNumber))
goto Found;
Console.WriteLine("The number {0} was not found.", myNumber);
goto Finish;
Found:
Console.WriteLine("The number {0} is found.", myNumber);
Finish:
Console.WriteLine("End of search.");
Console.WriteLine("Press any key to exit.");
}
8.按位运算符:假定有两个数,按位运算符从最左边的位开始,逐位进行逻辑运算,直到最右边的位为止,一个位置处的值1会被视为 true,值0会被视为false。12与7的二进制表示为:00001100,00000111;所以如果对两个值执行按位AND(&)运算,就会逐位比较第一个操作数数(12)和第二个操作数(7),得到二进制值00000100,也就是十进制的4。另外这两个值的按位OR(|)运算结果是00001111,也就是十进制的15。按位XOR(^)结果是00001011,也就是十进制的11。其判断原则“&”都为true才是true,“|”有一个为true才为true,“^”仅有一个为true才为true。
byte and, or, xor;
and = 12 & 7;//按位运算符也可以与赋值运算符合并,如 and |= 7;
or = 12 | 7;
xor = 12 ^ 7;
Console.WriteLine("12和7的按位运算结果,and={0},or={1},xor={2}", and, or, xor);
9.移位运算符:“<<”、“>>”用于对数字的二进制位数据进行移位。
const int size = 64;
char bit;
Console.Write("Enter an integer: ");
var value = http://www.mamicode.com/ulong.Parse(Console.ReadLine());
ulong mask = 1ul << size - 1;//此处mask为2的63次方,二进制就为1的后面有63个0,而ulong的最大值为2的64次方后再减1,
for (int count = 0; count < size; count++)
{
bit = ((mask & value) > 0) ? ‘1‘ : ‘0‘;//此处mask的二进制只有第一位是1,其他为0,按位异或后,只有都是1才会大于0
Console.Write(bit);
mask >>= 1;
}
Console.WriteLine();
Console.WriteLine("-9的二进制 {0}", Convert.ToString(-9, 2));//将32位的整数转换为他的2进制字符串表现形式
Console.WriteLine("8的二进制无符号取反:{0}", ~(uint)8);//取反的类型为int、uint、long、ulong,按位取反运算符是对操作数的每一位取反。
10.比较两个数值:在比较两个值是否相等的时候,浮点类型(float、double)的不准确性可能造成非常严重的后果。有的时候,本来应该相等的值被错误地判断为不相等。
decimal number1 = 4.2m;
float number2 = 0.1f * 42f;
double number3 = 0.1 * 42;
Console.WriteLine("number1=number2 : {0}", (float)number1 == number2);
Console.WriteLine("number2=number3 : {0}", number2 == number3);
11.递增与递减运算符的使用注意:递增或递减运算符的位置决定了所赋的值是操作数计算之前还是之后的值,而这会影响代码的运作,如果希望result的值包含递增(或递减)计算的结果,需要将操作符放在想要递增的变量之前。但是不管是前缀后还是后缀,变量值都会改变。
12.逻辑布尔运算符,有And(&&)、Or(||)、XOR(^)、Not(!),其中^是异或运算符,若应用于两个布尔操作数,那么只有在两个操作数中仅有一个为true前提下,XOR运算符才会返回true。
13.C#预处理器指令是在编译时调用的,预处理器指令告诉C#编译器要编译那些代码,并指出如何处理特定的错误和警告。也可以是不同平台之间的差异,比如在windows和linux中用#if区别对待不同系统的API;预处理器指令也可以在调试中使用,比如用#if debug指令将调试代码包围起来。预处理器指令为 #if(#endif)、#elif、#else、#define(声明指令)、#under(取消指令定义)、#error(指定生成错误)、#warning(指定生成警告)、#pragma(禁用或恢复 #warning指令)、#line(改变编译器在报告错误或警告时显示的行号)、#region(#endregion)。
14. foreach循环期间,编译器禁止修改迭代变量。
--------------------------以上内容根据《C#本质论 第三版》进行整理
C#学习笔记1