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 = 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#本质论 第三版》进行整理

时间: 2024-10-25 14:15:02

C#学习笔记1的相关文章

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Activiti 学习笔记记录(三)

上一篇:Activiti 学习笔记记录(二) 导读:上一篇学习了bpmn 画图的常用图形标记.那如何用它们组成一个可用文件呢? 我们知道 bpmn 其实是一个xml 文件

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

[原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

[原创]java WEB学习笔记12:一个简单的serlet连接数据库实验

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------