2C#小知识
* 关于null和""的区别
* double类型保留两位小数
double a = 3.3333;
//方式1 转为字符串,然后再转double
string str = a.ToString("0.00");//a.ToString("f2");这样也可以
a = Convert.ToDouble(str);
Console.WriteLine(a);
//方式2 占位符
Console.WriteLine("{0:0.00}",a);
* 常量和只读
const:常量,常量肯定也是只读的。不变的量,只需要初始化的时候赋值,比如pai,log 。
readonly:只读
常量和只读字段的区别:
常量只能在初始化的给值,除此之外任何地方都无法修改
只读字段有两个地方可以选择
1:初始化的使用
2:构造函数 因为构造函数可以写多个,所有只读属性可以有多个不同的值。而常量始终只能一个值。
* 索引器
索引器: 可以使用 对象名加一个中括号 例如:obj[参数] ,数组,字符串 这三个地方都使用到了索引器。
索引器其实是一种特殊的属性,属性的本质是方法
索引器本质也是两个方法而已,只是一种语法糖,方便我们使用的。提供了两个特色的方法get,set
比如:用一个类当中创建索引器
在外面实例化调用
* 计时器
//创建计时器对象
Stopwatch sw = new Stopwatch();
//调用开始计时的方法
sw.Start();
//.........一大堆用于测试的代码
//结束
sw.Stop();
//输出用时
Console.WriteLine(sw.Elapsed);
* @符号
1、取消\在字符串中的转义作用,使其单纯的表示为一个''
2、将字符串按照编辑的原格式输出
* 产生随机数
1、创建能够产生随机数的对象
Random r = new Random();
2、产生随机数 (1,7)
int rNumber = r.Next(1, 7);
* 访问修饰符
public:公共的,在任何项目每个地方都能访问
private:私有的,只能在当前类里面访问,类里面的成员默认就是这个权限
protected:受保护的,可以在当前类里面和这个类的子类里面访问。
internal:只能在当前项目中访问。
protected internal:protected+internal
能够修饰类的访问修饰符只有两个:public、internal(类默认)。
子类的访问权限不能高于父类的访问权限,会暴漏父类的成员。
* 数组的方法
数组的方法 使用关键字 Array来调用,Array是 一个静态类
Array.Sort();
* 输出对象
我们将一个对象输出到控制台 ,默认情况下,打印的就是这个对象所在的命名空间
int[] arrayint = { 1, 3, 5, 7, 9 };
Console.WriteLine(arrayint);
* 改变控制台颜色
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("sdfsd");
Console.ForegroundColor= ConsoleColor.Blue;
Console.WriteLine("sdfsd");
* 获得数据类型
int a1 = 15;
Console.WriteLine(a1.GetType());
* 强类型与弱类型和var
var :推断类型
C#中的var和js的var不是一个意思
C#是一门 强类型语言:在代码当中,必须对每一个变量的类型有一个明确的定义
比如 15 必须用 int 变量名 = 15; 这样定义
js是一门 弱类型语言:在代码当中,不需要对一个变量的类型有明确的定义
比如 true "张三" 15 这些值,都用var类型即可, 格式:var 变量名 = 15; 这样定义就行了,var它能根据你的值推断你的变量类型(自动)
用var虽然方便,但是你稍微代码量上来一些,写着写着就记不得了,编译各种数据类型报错你都找不到错在哪里
var就是把数据类型的判别工作交给编译器去做了,所以增加编译器负担,在使用var关键字的时候,必须要给变量赋初值(如果 给个null就搞笑了,内存要分配空间的啊,null没法分),
否则var推断不出数据类型。
用了var的地方编译器都调用了GetType方法了吧?
js现在推荐用用let声明,1,有块级作用域概念可以变量污染,
* for与foreach
普通for循环需要知道长度,foreach无需知道长度,大量循环foreach效率比 for高
* Guid不重复的编号
用法:
Guid.NewGuid()
暂停线程
System.Threading.Thread.Sleep(1000);
抛出异常
throw new NotImplementedException();//抛出异常
如:
可空类型
自动属性中
public Nullable<int> ID { get; set; }
方法签名中
public void Hello(int?a){}
获取当前项目的根目录
string path = AppDomain.CurrentDomain.BaseDirectory;
在asp.net中可以用~符代表当前项目根目录
编译后的Debug里的配置文件
一般生成都会自动编译好一个Debug文件夹,这里面就是启动该项目用到的文件。比如配置文件,一般项目都会有一个配置文件。
但是,这个配置文件也会被编译后放在Debug,有时候不想打开vs软件修改后重新生成,可以直接修改编译后的配置文件信息。
项目文件始终复制和不复制
比如:在根目录里有一个plugs文件夹,里面存放了两个文件,一个始终复制,一个不复制,不复制的那个文件在每次重新编译这个项目的时候,这个文件夹里的不复制属性的文件就不会被编译复制到Debug下,反之,始终复制的话每次编译都会复制到Debug文件夹里的plugs文件夹中,每次都会替换掉旧的文件。如果不复制,如果这个文件夹里面是存程序集的话,那么反射就无法拿到不复制的程序集,因为编译后的plugs文件夹中没有属性为不复制的程序集,
我们给项目重新生成,让他编译一下