C# 零散知识点总结

关于C#的测试断言详解
委托:http://www.cnblogs.com/liuhaorain/p/3911845.html

sbyte(8位)

sbyte表示一种整数类型,可以表示大小和存储范围。
从sbyte转换为short,int,long,double,float,decimal都是隐式转换。
不能将一个存储大小更大的非文本数字类型转换给sbyte。

前缀0x或者0X表示十六进制文本, 0b或者0B表示二进制文本,十进制没有前缀.

decimal类型用来表示高精度的浮点数, 可用1M来表示。

varible.GetType() ,typeof(varible)

int n =9;
n.GetType() 等价于 typeof(n) , 获取n的数类型

ReferenceEquals() 比较两个数值型的值

using System;

public class Example
{
   public static void Main()
   {
      int n1 = 12;
      int n2 = 82;
      long n3 = 12;

      Console.WriteLine("n1 and n2 are the same type: {0}",
                        Object.ReferenceEquals(n1.GetType(), n2.GetType()));
      Console.WriteLine("n1 and n3 are the same type: {0}",
                        Object.ReferenceEquals(n1.GetType(), n3.GetType()));
   }
}
// The example displays the following output:
//       n1 and n2 are the same type: True
//       n1 and n3 are the same type: False 

值类型和 引用类型

值类型: 值类型的变量中存储的实际数据,赋值时是编译器把数据复制一份,然后赋给另一个变量
引用类型:引用类型变量中存储的是指向实际数据的引用(真是数据的内存地址),在赋值操作时,和值类型一样,也要进行复制的操作,不过它复制的不是实际数据,而是引用(真实数据的内存地址),所以引用类型在赋值操作时,赋值给另一个变量的是内存地址,这样两个变量中保存的是同一引用,它们的指向完全一样。

例子2:

class MyClass            
 {
       public int val;
}

struct MyStruct
{      public int val;  }

class Program
{
      static void Main(string[] args)
      {
             MyClass objectA=new MyClass();
             MyClass objectB=objectA;  //引用变量的赋值 赋值操作完成后,两个变量都指向同一内存地址
             objectA.val=10; //给objectA.val赋值=10 由于objectB和objectA指向同一内存地址,所以ojbectB.val的值也为10
             objectB.val=20; //给objectB.val赋值=20 由于objectB和objectA指向同一内存地址,所以objectA.val的值也为20

             MyStruct structA=new MyStruct();
             MyStruct structB=structA;                //结构是值类型 赋值操作完成后,两个结构中的结构信息一致。注意是“结构中的信息”一致。
             structA.val=30;
             structB.val=40;

             Console.WriteLine(objectA.val);         //输出结果是20
             Console.WriteLine(objectB.val);         //输出结果是20
             Console.WriteLine(structA.val);         //输出结果是30
             Console.WriteLine(structB.val);         //输出结果是40
             Console.ReadLine();
       }
}

总结:

  • 值类型的变量赋值,只是数据之间的复制
  • 引用类型赋值操作,复制的引用,即内存地址,引用类型赋值后 ,二者指向同一个内存地址。如果改变其中一个引用类型变量的值,另一个也会跟着变。

*另一种不同于上面的引用类型,String, 它的特点就是在赋值的时候或者字符串相加操作时,它会在内存中开辟一个新的内存空间来存储操作后的字符串. *

using System;  
class Test  
{  
    public static void Main()  
    {  
        string s1 = "hello";  
        string s2 = s1;  
        Console.WriteLine(s1);  
        Console.WriteLine(s2);  
        s1 = "world";  
        Console.WriteLine(s1);  
        Console.WriteLine(s2);  
    }  
}  
/* 
hello 
hello 
world 
hello 
*/  

解释
(1) s1 = "hello", 执行的是在堆中创建了一个String类型的对象,然后将这个对象的地址赋值给s1.
(2) s2 = s1, 执行的是将"hello"对象的地址赋值给s2,此时s2和s1是指向的同一个地址;
(3) s1 = "world". 这里编译器将会在内存中重新创建一个String类型的对象,然后将其地址赋值给s1,此时s1将指向新的地址,不再和s2指向相同的地址。所以这里给s1赋值实际上并不会改变"Hello"这个对象,也就是不会改变s2所指向的地址的内容,它改变s1指向的地址(重新分配一个新的地址),而不是它原来指向的对象的内容。

强制类型转换

隐式类型转换: int (32位,4个字节(byte)) 转换到-------> long (64位),float(4byte,32位),double(64),decimal(128,有效位数很大,但是表示的范围比float和double都小) 。
a. 显式类型转换:(int)variable.

  • 从long到int的转换,必须显式,否则会产生编译错误。
  • 该方式对于float的转换,会失去精度。
  • 可以用于object ---> int, 前提是:object的值要被赋予int类型的值,否则会产生编译错误。
    注意: 不能用于char 类型到int类型的转换,转后的值会变成ASCII代码,而不是你想要

b. int.Parse(string 类型的变量)
表示把内容是数字的字符串转化为int
该方法只能处理字符串内容,而且字符串的内容只能在int类型可表示的范围之内。

  • 如果字符串的内容为null时,则抛出ArgumentNullException异常。
  • 如果字符串的内容不是数字,则抛出FormatException异常。
  • 如果字符串内容所表示的数字超出int类型可表示的范围,则抛出overflowException异常。

c. int.TryParse( string s, out int result)
该方式也是将数字内容的字符串转化为int类型,但是比int.Parse更优越,它不会抛出异常。如果转换成功,则返回true,转换失败返回false。很明显,最后一个值作为输出值,如果转换失败,输出值为0;如果转换成功,则输出相应的值。

注意: 不能用于char 类型到int类型的转换,转后的值会变成ASCII代码,而不是你想要的。

匿名类型

定义匿名类型
定义一个匿名类型时,需要用到 var 关键字和对象初始化语法。
var : 编译器会在编译时自动生成新类定义(我们无法在C#代码中看到类的名称)。
初始化:它将告诉编译器为新创建的类型创建私有的后台字段和(只读的)属性。

 var annonymousTypeInstance = new
            {
                FirstName = "Bill",
                LastName = "Gates"
            };

        
annonymousTypeInstance;.FirstName ; // "Bill";
annonymousTypeInstance.LastName ; //  "Gates";

匿名类型本身有许多限制:

  • 你并没有控制匿名类型的名称
  • 匿名类型继承System.Object
  • 匿名类型的字段和属性总是只读的
  • 匿名类型不支持事件,自定义方法,自定义操作符和自定义重写
  • 匿名类型是隐式封闭的(implicit sealed)
  • 匿名类型的实体创建只使用默认构造函数
    如果,我们需要快速定义一个实体的形状,而不需要定义其功能时,可以使用匿名类型。

as

用作类型转换,转换不成功时,返回null。

AppendLine()

每次在新的一行添加目标内容,并在末尾加上\r\n

反射 ,及其类Type

请参考

DateTime

它是的定义struct类型,所以它是值类型

ValueType值类型

所有的值类型都是继承至System.ValueType

internal

修饰符,限定的是只是在同一程序集中可访问。

修饰符 Nullable

C#中不允许把null赋值给一个值类型的数据,但是利用Nullable修饰符可可以申明一个可空值类型,可空值类型和普通值类型是一样的,区别就是可以将一个null赋值给它。

Nullable<int> nullableInt = null;
int? nullableInt = null;//int 后面加?表示可空值类型,  是一种特殊的值类型,它的值可以为空。
//用于给变量赋初值的时候,给变量(int类型)赋值为null,而不是0.

int ?? ://用于判断并赋值,先判断当前变量是不是null,如果是就可以赋新值,否则跳过

可空类型Nullable有两个只读属性:

  • HasValue , 属于bool类型,只要变量包含非空值,它的值就是true。
  • Value , 如果HasValue为true,则说明Value包含有意义的值,那么该变量访问Value属性时,就会返回变量的值;如果HasValue为false, 则访问Value属性将引发InvaildOperationException

yield return

一般情况下,yeild return 会出现在循环遍历中,不适用yeild return时,代码的执行过程是 ,将结果集全部加载到内存中再遍历。
使用yeild return,代码的执行过程是,每调用一个yelid return 所在的循环时,yelid return 就返回一个值回来,是“按需供给“。
yeild return 能保证每次循环遍历的时候都从前一次停止的地方开始,因为编译器会生成一个状态机来保证迭代器的状态。

一个循环遍历中可以有多个 yelid return ,来一次性返回多个值。
一旦执行 yelid break, 后面的代码将不会再执行。

SortedSet<T> 是一个排序的无重复数据的集合。

GetEnumerator()

获取枚举数。
枚举数定位在集合中第一个元素前,在此位置上,Current属于未定义,故在读取current之前,必须调用MoveNext() 将枚举数向前定位到集合的第一个元素,即MoveNext()
将Current设置为下一个元素。
如果MoveNext(0越过集合的末尾,则枚举数将被定位到该集合中最后一个元素的后面,则MoveNext()将返回false。

int[] MyArray = { 10, 11, 12, 13 };                           //创建数组 
IEnumerator ie = MyArray.GetEnumerator();         //获取枚举数 
while (ie.MoveNext())                                             //移到下一项 
    Console.WriteLine((int)ie.Current);                   //获取当前项并输入 

枚举数的初始位置是-1,所以要想获取第一个元素就必须执行MoveNext()方法.
上面的代码就是调用枚举数的Current和MoveNext成员函数手工地遍历数组中的元素.

using语句

定义一个范围,在范围结束时处理对象。
使用场景,在某个代码段中使用了类的实例,这个代码段结束时自动执行这个类实例的Dispose方法。

using (Class1 cls1 = new Class1(), cls2 = new Class1())
{
  // the code using cls1, cls2
} // call the Dispose on cls1 and cls2

ReferenceEquals()

比较两个对象的引用是否相等,即是指向统一内存地址。

OrderBy()

实现List 升序降序。

var sequence = new[] {4, 2, 1, 3, 5};
List<Student> items = sequence.OrderBy(u => u.Name).ToList();//order by name asc
List<Student> items = sequence.OrderByDescending(u => u.Name).ToList();//order by name desc

Any()

判断序列中的任何元素是否都满足条件,返回bool 值。

var sequence = new[] { 1, 2, 3, 4, 5 };

 bool sequenceNotEmpty = sequence.Any();
//true, 判断集合是否为空
 //从Any和Count的差别说起.Any() 使用IEnumerator.GetEnumerator() 和 MoveNext() 來判断是否集合为空,而Count()则是返回整个集合的元素个数

bool modThreeNotEmpty = sequence.Any(item => item % 3 == 0);
//true, 是否有一个一个元素满足此条件

Where()

按条件筛选序列中的元素,返回满足条件的元素。

string[] sequence =
            {
                "a", "quick", "brown", "fox", "jumps", "over", "a", "lazy", "dog"
            };
 IEnumerable<string> filteredResult = sequence.Where(item => item.Length == 5);
 //子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素 ,用作筛选
C#中过滤使用 Where() 扩展

int[] data = { 46, 74, 20, 37, 98, 93, 98, 48, 33, 15 };
int[] result = data.Where(n => n % 3 == 0).ToArray();

注意:Where() 的结果即不是数组也不是 List,需要通过 ToArray() 生成数组,或者通过 ToList() 生成列表。Linq 要在 ToArray() 或者 ToList() 或者其它某些操作的时候才会真正遍历,依次执行 Where() 参数提供的那个筛选函数。

Select()

 var sequence = new[]
            {
                new Name("Edogawa", "Conan"),
                new Name("Ogiso", "Setsuna"),
                new Name("Kirigaya", "Katsuto")
            };

IEnumerable<string> projection = sequence.Select(item => item.ToString());
// {"Edogawa Conan", "Ogiso Setsuna", "Kirigaya Katsuto" };

Take()

取前n个数。

var sequence = new[] {1, 2, 3, 4, 5};

 IEnumerable<int> filteredElements = sequence.Take(3);// C#IList取前N行使用Take()方法
// {1, 2, 3};

Skip()

跳过前n个数

var sequence = new[] {1, 2, 3, 4, 5};

 IEnumerable<int> filteredElements = sequence.Skip(3);
// { 4, 5};

first()

满足条件的第一个数。

 var sequence = new[] { 1, 2, 3, 4, 5 };

 int firstElement = sequence.First(); //1
 int firstEvenNumber = sequence.First(item => item % 2 ==0); // 2   

Last()

满足条件的最后一个数。

var sequence = new[] { 1, 2, 3, 4, 5 };

  int lastElement = sequence.Last(); //5
 int lastEvenNumber = sequence.Last(item => item % 2 == 0);  //4

ElementAt()

第n个下标处的元素。

 var sequence = new[] { 1, 2, 3, 4, 5 };
 int thirdElement = sequence.ElementAt(2);  //3

Count()

int totalNumber = sequence.Count(); // 5, Count 方法如果不带参数,则和 Count 属性一样,和length一样
int numberOfEvenNumbers = sequence.Count(item => item % 2 == 0);//2, 查询为偶数的个数

Min() 求序列的最大值, Max() 求序列的最小值

All()

是否序列中的所有元素都满足条件,返回bool值。

var sequence = new[] { 2, 4, 6, 8, 10 };
 bool allEvenNumbers = sequence.All(item => item % 2 == 0); //true

contains() , Concat()

A.contains("b") : A中是否包含某元素b
A.Concat(B) : A和B拼接在一起

Union()求并集, Intersect()求交集, Except()求差集

A.Union(B): 求A和B的并集,并去掉重复元素。
其他类似

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容