.NET程序执行前后各种逻辑角色之间的关系:

1、关于可空类型的理解:

首先,只能定义可空的值类型,不能定义可空的引用类型。任何可空的类型都可以表示为该类型在内存的栈中分配空间范围之内的值和null。

对于int a = null是不合法的,只能这样写:int? a = null。

定义为局部变量的可空类型必须进行初始化赋值。

方法中的可空类型参数(int? a)必须定义在必选参数之后;

其原型是System.Nullable<T>结构类型

2、关于==和equals()的比较:

在c#中,值类型的数据都是存储在内存的堆栈(简称栈)中的(注:即使是值类型,在栈中也会另外分配一块区域用于存储指向存储数据内容的内存区域的指针地址,在对值类型数据进行比较时是比较的存储数据的内容,非指针地址),引用类型指向的对象存储在内存的堆中,指向对象的引用变量存储在栈中。

基于以上:对于值类型,==和equals()是等价的,都是比较栈中的内容是否相同;对于引用类型,==比较的是堆中引用指向的对象是否相同,equals()比较的指向对象的引用变量在栈中内容是否相同;另外,string是一个比较特殊的引用类型,可以当做值类型来使用,所以对于string类型,==和equals()是等价的,都是比较其内容是否相同。

string类型初始化的特殊情况:

string a = "123";
string b = "123";

在给b初始化与a相同的内容时,并没有给b在堆中分配空间,只是把a中指向"123”的地址赋给了b,所以在栈中,a和b的内容是一样的。

3、关于IEnumerable和IEnumerator接口的理解:

MSDN解释:

IEnumerable:公开枚举数,该枚举数支持在非泛型集合上进行简单迭代。

IEnumerator:支持对非泛型集合的简单迭代。

IEnumerable接口中只有一个唯一的抽象方法GetEnumerator(),GetEnumerator()方法返回一个IEnumerator类型引用;

IEnumerator成员:

public object Current {get; set;}//表示当前迭代的子项

public bool MoveNext();//判断是否有下一项,并更新索引到下一项

public void Reset();//将索引重置为初始值

所有支持foreach语句的对象都必须继承IEnumerable接口,并实现GetEnumerator方法;

.NET Framework中定义的数组、集合类型都实现了IEnumerable接口;

自定义类型实现IEnumerable接口:

namespace ForeachTestCase
{public class Car{public string Name { get; set; }public int Speed { get; set; }}public class Factory : IEnumerable{Car[] cars = new Car[2];public Factory(){cars[0] = new Car { Name = "nisson", Speed = 120 };cars[1] = new Car { Name = "benze", Speed = 200 };}public IEnumerator GetEnumerator(){
            //对于cars数组,framework已经定义好了GetEnumerator方法,可直接调用return this.cars.GetEnumerator();}}class Program{static void Main(){Factory factory = new Factory();foreach (Car car in factory){Console.WriteLine("car:{0}, Speed:{1}", car.Name, car.Speed);}Console.ReadKey();IEnumerator enumerator = factory.GetEnumerator();while (enumerator.MoveNext()){Car car = (Car)enumerator.Current;Console.WriteLine("car:{0}, Speed:{1}", car.Name, car.Speed);}Console.ReadKey();}}
}

手动实现IEnumerator接口:

namespace ForeachTestCase1
{public class ForeachString : IEnumerable{private string[] elements;private int ctr = 0;public ForeachString(params string[] initialStrings){elements = new string[initialStrings.Length];foreach (string str in initialStrings){elements[ctr++] = str;}}public ForeachString(string initialStrings, char[] splitChar){elements = initialStrings.Split(splitChar);}public IEnumerator GetEnumerator(){return new ForeachStringEnumerator(this);}private class ForeachStringEnumerator : IEnumerator{private int position = -1;private ForeachString str;public ForeachStringEnumerator(ForeachString str){this.str = str;}public object Current{get{return str.elements[position];}}public bool MoveNext(){if (position < str.elements.Length - 1){position++;return true;}else{return false;}}public void Reset(){position = -1;}}static void Main(){ForeachString str = new ForeachString("hello", "IEnumerable", "IEnumerator");foreach (string s in str){Console.WriteLine(s);}Console.ReadKey();}}
}

4、关于C#中方法签名中参数定义的几种关键字用法解释:

1、ref

使用ref传参时传递的是变量的引用,一般用于值类型,在方法体中对变量的更改会改变方法体之外的该变量的值,在使用ref传参时,变量必须先赋值。在定义和调用方法时,必须显式的使用ref关键字。

注意:此处所说的引用不同于引用类型的引用,此处引用是指分配在栈中的一块指针区域,指向在栈中为值类型变量对象存储分配的一块另内存区域。

public static void TestRef(ref int i){i = 10;}static void Main(){int i = 5;TestRef(ref i);Console.WriteLine(i.ToString());Console.ReadKey();}
2、out

使用out传参时也是传递的参数的引用,作为out参数传递的变量不必先赋值,在方法体中必须对out参数赋值。在定义和调用方法时,必须显式的使用out关键字。

public static void TestOut(out int i){i = 10;}static void Main(){int i;TestOut(out i);Console.WriteLine(i.ToString());Console.ReadKey();}
3、params

表示方法定义了不确定个数的参数,方法定义时使用数组作为参数,方法调用时传递的不确定个数的参数必须能够作为子项组成定义的数组。

public static string TestParam(params string[] paramString){string charactors = "";foreach (string str in paramString){charactors += str;}return charactors;}static void Main(){Console.WriteLine(TestParam("hello", "world", "!"));Console.ReadKey();}
4、可选参数

可选参数必须在定义时赋值,并且必须放在参数列表的最后。

可选参数定义:

//b为可选参数

public void params OptionalMethod(int a, int b=0)

可选参数在编译时确定其初始值,不能在运行时确定,如下:

//由于DateTime的Now属性是在运行时确定,所以下面的可选参数定义会产生编译时错误
public void OptionalMethod(int a, dateTime dt = DateTime.Now)

5、获取当前日期所在的那一星期的星期一和星期天的日期:

DateTime dtNow = DateTime.Now;
DateTime dtMonday = dtNow.AddDays((int)(DayOfWeek.Monday - dtNow.DayOfWeek));
DateTime dtSunday = dtNow.AddDays((int)(DayOfWeek.Saturday - dtNow.DayOfWeek + 1));

6、服务器端和客服端编码/解码字符串的方法:

服务器端:

编码:HttpContext.Current.Server.HtmlEncode(stringValue)
解码:HttpContext.Current.Server.HtmlDecode(stringValue)
客服端:
编码:escape(‘stringvalue’); 解码:unescape(‘stringvalue’)

7、C#中数组声明与初始化的几种方式:

string数组声明:

string[] arr = new string[4]

string数组声明并初始化:

string[] arr = new string[2] { "cy", "kb" }
string[] arr = new string[] { "cy", "kb" }
string[] arr = { "cy", "kb" }
隐式数组声明:
var arr = new[] { 1, 2, 3 };

8、c#中char类型空值的几种表示方法:

char a = ‘\0’;

char a = Char.MinValue;

char a = (char)0;

char a = Convert.ToChar(0);

char a = ((char?)null).GetValueOrDefault();

9、格式化日期类型数据

HH表示为24小时制,hh表示为12小时制

转载于:https://www.cnblogs.com/JDotNet/p/3291705.html

C#各种小知识点总结相关推荐

  1. JavaScript 小知识点

    原型链相关 最详尽的 JS 原型与原型链终极详解 isNaN() 和 Number.isNaN() 的区别 isNaN() 是 ES1 规范: 是全局方法: 如果参数不是一个 Number 类型,会先 ...

  2. Python小知识点(3)--装饰器

    Python小知识点(3)--装饰器 (1)装饰器含参数,被装饰函数不含(含)参数 实例代码如下: import time # 装饰器函数 def wrapper(func):def done(*ar ...

  3. php-函数小知识点

    <?php //语句 //分支语句 /*$a=5; if($a==5) { echo "相等";} else { echo "budeng";}*/ // ...

  4. 0607am抽象类接口析构方法tostring小知识点

    /* class ren { public static $color;//静态 static function () { ren::$color; self::$color;//self只能写在类里 ...

  5. Python小知识点(5)--面向对象部分

    Python小知识点(5)--面向对象部分 面向对象: 世间万物,皆可分类.--------------------手机<--------------某一个分类 世间万物,皆为对象.------ ...

  6. JS,JQ,PHP的小知识点整理

    在日常开发中所使用的JS,JQ,PHP的小知识点整理 持续更新-- 1.js和jq获取当前的时间戳 方法一: <script>var timestamp = Date.parse(new ...

  7. C语言小知识点练习总结

    最近在准备C语言的上级考试,之前对C接触不多,在练习过程中把一些小知识点记录下来. 1.字符串的截取 利用strncpy函数,传入三个参数,分别为目标字符串,起始位置,长度. 例如将日期字符串转化为数 ...

  8. 通信工程专业的一些小知识点

    原文链接:(更多文章移步链接) 通信工程专业的一些小知识点 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/49285829 一. 无线信道的多径效应导致的频率选择 ...

  9. linux系统下用到的小知识点积累

    preface:在ubuntu下做事情,在终端下执行一些命令.或者在vim里面做一些操作.自然而然须要用到一些小知识点,没有怎么系统地看<鸟哥的菜>,基本上是遇到了什么问题想要实现什么功能 ...

  10. Python之路番外(第二篇):PYTHON基本数据类型和小知识点

    一.基础小知识点 1.如果一行代码过长,可以用续行符 \ 换行书写 例子 if (signal == "red") and \ (car == "moving" ...

最新文章

  1. php 冒泡置顶,浅谈php冒泡的排序
  2. CodeForces - 1295B Infinite Prefixes(数学)
  3. HDU - 2819 Swap(二分图完备匹配+路径输出)
  4. 软件获取手机的ime权限_【干货】解锁VIP会员权限,两款手机必备剪辑软件,免登陆,1080P输出无压力!...
  5. fanuc机器人控制柜接线_工业机器人控制柜及使用方法
  6. jscript错误代码及相应解释大全( 选择自 jmylf 的 Blog )
  7. Windows官方经典壁纸
  8. 个人理解设计为何要多用组合,少用继承
  9. warning: control reaches end of non-void function [-Wreturn-type]
  10. 打印机 linux 共享文件夹,linux 连接windows打印机
  11. php deflate 解压,PHP编码gzdeflate与Golang解码DEFLATE
  12. 谈谈你对web语义化的理解
  13. matlab中eval的用法
  14. 面向数据发布和分析的差分隐私保护 -- 张啸剑
  15. 录音转文字,怎么把手机录音转文字
  16. background-attachment: fixed
  17. 2021年四川高考成绩及录取结果查询,2021年四川高考录取结果查询时间及查询入口,录取结果多少号公布...
  18. 中国医用器械产业运行状况分析与投资策略研究报告2022-2028年
  19. 使用树莓派GPIO17和GPIO18连接DS18B20温度传感器(关于DS18B20的时序设置)
  20. ZJOI2019一轮停课刷题记录

热门文章

  1. 网站排名在首位后,为什么还要继续做SEO?
  2. 浅析网站建设的基本原则
  3. 网站权重增长缓慢,优化技巧是关键!
  4. java cache缓存_涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?
  5. 电脑换ip软件_为什么会有企业需要软件换IP?
  6. 计算机CPU哪家好,2019年电脑cpu排行榜_电脑CPU哪个好 电脑CPU排行榜2019
  7. https 不会被中间人攻击——因为中间人即使拿到了数据,也是加密的
  8. 常见的DNS攻击——偷(劫持)、骗(缓存投毒)、打(DDos)
  9. 9月22日 奇怪的贸易
  10. [4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔