1、@
在处理字符串时,那些个字符串转义字符我们可以使用这个,那@就是为解决这个而诞生的,直接让字符串原样输出有木有?什么sql字符串了,还有路径啥了的,统统搞定
string sql = @"select * from student where id = '001'"; //实际sql输出select * from student where id = '001' string path = @"C:MDocustudent.xml"; //实际path输出C:MDocustudent.xml,注意这里可不是\哦
如果字符串里边包含双引号时,要稍微处理一下,那就是在双引号的外边再加双引号即可
string s = @"He said,""yes"""; //s输出He said,"yes"
2、is
目的就一个,检查变量是不是给定的类型,是就返回true,不是就false
int i = 5; bool check = i is int;//check = true
3、as
tring s = someObject as string; if (s != null) { // someObject is a string. }
as运算符类似于强制转换操作;但是,如果转换不可行,as会返回null而不是引发异常。更严格地说,这种形式的表达式 等效于
expression is type ? (type)expression : (type) null
as 运算符只执行引用转换和装箱转换。as运算符无法执行其他转换,如用户定义的转换,这类转换应使用cast表达式来执行。
B[] bb = new B[] { new B(), new B(), new B(), new B() }; string[] query = bb.Cast<string>().ToArray(); IEnumerable<Employee> query = listBox.Items.Cast<Employee>(); int count = listBox.Items.Cast<Employee>().Count(); bool b = listBox.Items.Cast<Employee>().Any(e => e.FirstName == "Bob");
int intSize = sizeof(int);//intSize = 4
Type myType = typeof(int); console.writeline("Type:{}",myType); //输出Type:System.Int32
short a =20000,b=20000; short myShort = checked((short)(a+b)); //error
short a =20000,b=20000; short myShort = unchecked((short)(a+b)); //忽略error
uniquecode = Guid.NewGuid (); console.WriteLine("myCode:{}",uniquecode.ToString()); //输出:myCode:cabfe0ba-fa72-4c5c-969f-e76821949ff1
public class student { private string name; private int? age=null; public string Name { get { return name; } set { name = value; } } public int? Age { get { return age; } set { age = value; } } } student s = new student(); s.Age = null;//是允许的
DateTime? createDate = null; DateTime? defaultDate= null; DateTime secondDate = DateTime.Now; createDate = createDate ??defaultDate??secondDate; // 如果createDate 为空,则对defaultDate求值,如果defaultDate不为空,则将defaultDate赋值给createDate 。否则继续计算secondDate,是不是null都赋值给createDate ,因为是最后一个表达式
using colAlias = System.Collections; namespace System { class TestClass { static void Main() { // Searching the alias: colAlias::Hashtable test = new colAlias::Hashtable(); // Add items to the table. test.Add("A", "1"); test.Add("B", "2"); test.Add("C", "3"); foreach (string name in test.Keys) { // Searching the global namespace: global::System.Console.WriteLine(name + " " + test[name]); } } } }
List<User> user = new List<User>{ new User{Id=1,Name="LiSi",Age=22}, new User{Id=2,Name="ZhangSan",Age=25} }; //获取特定人时所用的过滤条件,p参数属于User类型 var results = user.Where(p => p.Name == "LiSi").ToList(); //用User对象的Age值计算平均年龄 var average = user.Average(p => p.Age);
Lambda表达式是c#3.0的新内容,例如,我定义一个委托:
delegate int Method(int a,int b); //再定义一个方法: int Add(int a,int b) { return a+b; } //我可能需要这样通过委托调用方法: Method m+=Add; Console.WriteLine(m(2,3)); //但如果用Lambda表达式: Method m+=(a,b)=>a+b; Console.WriteLine(m(2,3)); //可以省去方法的定义;实际上,Lambda表达式只是简化了匿名方法的语法而已。
附c#2.0的匿名方法语法:
Method m+=delegate(inta,int b){return a+b;}; Console.WriteLine(m(2,3));
class RefExample { static void Method(ref int i) { i = 44; } static void Main() { int val = 0; Method(ref val); // val is now 44 } }
public DataSet getData(out int count) { dataset ds=bll.getdata(10,20); //获取第11条到第20条数据,但是不可能只显示共有10条记录吧,那么我们就可以用out了 int rcount=bll.GetCount();//比方说这个是取总记录数的 count=rcount; return ds; } //显示的时候 public void showdata() { int count=0; gridview1.datasource=getData(out count); gridview1.databind(); label1.text="共有"+count.tostring()+"条记录"; }
params using System; public class MyClass; { public static void UseParams(params int[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } public static void UseParams2(params object[] list) { for (int i = 0 ; i < list.Length; i++) { Console.WriteLine(list[i]); } Console.WriteLine(); } static void Main() { UseParams(1, 2, 3); UseParams2(1, 'a', "test"); // An array of objects can also be passed, as long as // the array type matches the method being called. int[] myarray = new int[3] {10,11,12}; UseParams(myarray); } }
16、using
这个再也熟悉不过了,常见三种用法
(1)引用命名空间,例如:
using System; using System.Collections.Generic; using System.Linq; using System.Text;
(2)创建别名(类或者命名空间的别名)
using MyControle=System.Console; class UsingEx { public static void Main() { MyConsole.WriteLine("应用了类的别名"); } }
(3)自动清理资源
using (SqlConnection conn = new SqlConnection(_connstr)) //这样你就不用手工清理连接资源了
17、this
用法一 this代表当前类的实例对象
namespace Demo { public class Test { private string scope = "全局变量"; public string getResult() { string scope = "局部变量"; // this代表Test的实例对象 // 所以this.scope对应的是全局变量 // scope对应的是getResult方法内的局部变量 return this.scope + "-" + scope; } } class Program { static void Main(string[] args) { try { Test test = new Test(); Console.WriteLine(test.getResult()); } catch (Exception ex) { Console.WriteLine(ex); } finally { Console.ReadLine(); } } } }
用法二 用this串联构造函数
namespace Demo { public class Test { public Test() { Console.WriteLine("无参构造函数"); } // this()对应无参构造方法Test() // 先执行Test(),后执行Test(string text) public Test(string text) : this() { Console.WriteLine(text); Console.WriteLine("有参构造函数"); } } class Program { static void Main(string[] args) { try { Test test = new Test("张三"); } catch (Exception ex) { Console.WriteLine(ex); } finally { Console.ReadLine(); } } } }
用法三 为原始类型扩展方法
特点:1、静态类 2、静态方法 3、第一个参数前加this
例如:public static List<T> ToList<T>(this string Json),就是为this对应的string类型扩展类ToList()方法,调用方式 strJson.ToList();
详细扩展
namespace Demo { public static class Extends { // string类型扩展ToJson方法 public static object ToJson(this string Json) { return Json == null ? null : JsonConvert.DeserializeObject(Json); } // object类型扩展ToJson方法 public static string ToJson(this object obj) { var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; return JsonConvert.SerializeObject(obj, timeConverter); } public static string ToJson(this object obj, string datetimeformats) { var timeConverter = new IsoDateTimeConverter { DateTimeFormat = datetimeformats }; return JsonConvert.SerializeObject(obj, timeConverter); } public static T ToObject<T>(this string Json) { return Json == null ? default(T) : JsonConvert.DeserializeObject<T>(Json); } public static List<T> ToList<T>(this string Json) { return Json == null ? null : JsonConvert.DeserializeObject<List<T>>(Json); } public static DataTable ToTable(this string Json) { return Json == null ? null : JsonConvert.DeserializeObject<DataTable>(Json); } public static JObject ToJObject(this string Json) { return Json == null ? JObject.Parse("{}") : JObject.Parse(Json.Replace(" ", "")); } } class Program { static void Main(string[] args) { try { List<User> users = new List<User>{ new User{ID="1",Code="zs",Name="张三"}, new User{ID="2",Code="ls",Name="李四"} }; // list转化json字符串 string json = users.ToJson(); // string转化List users = json.ToList<User>(); // string转化DataTable DataTable dt = json.ToTable(); } catch (Exception ex) { Console.WriteLine(ex); } finally { Console.ReadLine(); } } } public class User { public string ID { get; set; } public string Code { get; set; } public string Name { get; set; } } }
用法四 索引器(基于索引器封装EPList,用于优化大数据下频发的Linq查询引发的程序性能问题,通过索引从list集合中查询数据)
18、partial 局部类型
局部类型适用于以下情况:
(1) 类型特别大,不宜放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
(3) 需要多人合作编写一个类。
局部类型是一个纯语言层的编译处理,不影响任何执行机制——事实上C#编译器在编译的时候仍会将各个部分的局部类型合并成一个完整的类。
public partial class Program { static void Main(string[] args) { } }
2. 局部类型的限制
(1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
(2) 同一个类型的各个部分必须都有修饰符 partial。
(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4) 一个类型的各个部分必须被同时编译。
3. 局部类型的注意点
(1) 关键字partial是一个上下文关键字,只有和 class、struct、interface 放在一起时才有关键字的含义。因此partial的引入不会影响现有代码中名称为partial的变量。
(2) 局部类型的各个部分一般是分开放在几个不同的.cs文件中,但C#编译器允许我们将他们放在同一文件中。
4. 局部类型的应用特性
在局部类型上的特性具有“累加”效应。
[Attribute1, Attribute2("Hello")] partial class Class1{} [Attribute3, Attribute2("Exit")] partial class Class1{} //相当于 [Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")] class Class1 {} //注:Attribute2属性允许在类上多次使用。
(1) 一个类型的各个部分上的访问修饰符必须维持一致性。
(2) 如果一个部分类使用了abstract修饰符,那么整个类都将被视为抽象类。
(3) 如果一个部分类使用了 sealed 修饰符,那么整个类都将被视为密封类。
(4) 一个类的各个部分不能使用相互矛盾的修饰符,比如不能在一个部分上使用abstract,又在另一个部分上使用sealed。
(5)如果一个部分类使用了 static修饰符,那么整个类都将被视为静态类。
6. 局部类型的基类和接口
(1) 一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类,但如果指定,则必须相同。
(2) 局部类型上的接口具有“累加”效应。
partial class Class2: Iinterface1, Iinterface2 {} partial class Class2: Iinterface3 {} partial class Class2: Iinterface2 {} //相当于 class Class2: Iinterface1, Iinterface2, Iinterface3 {}
16、using
例如:
2.1关于base调用基类构造函数
public class A { public A() { Console.WriteLine("Build A"); } } public class B:A { public B():base() { Console.WriteLine("Build B"); } static void Main() { B b = new B(); Console.ReadLine(); } }
2.2关于base在派生类中调用基类的方法。
public class A { public virtual void Hello() { Console.WiriteLine("Hello"); } } public class B : A { public override void Hello() { base.Hello();//调用基类的方法,显示Hello Console.WiriteLine("World"); } }
最后补充下,根据MSDN Library介绍来看这两个关键字都是属于[访问关键字]类型
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。
示例:
1. 在派生类中调用基类方法。
using System; public class BaseClass { protected string _className = "BaseClass"; public virtual void PrintName() { Console.WriteLine("Class Name: {0}", _className); } } class DerivedClass : BaseClass { public string _className = "DerivedClass"; public override void PrintName() { Console.Write("The BaseClass Name is {0}"); //调用基类方法 base.PrintName(); Console.WriteLine("This DerivedClass is {0}", _className); } } class TestApp { public static void Main() { DerivedClass dc = new DerivedClass(); dc.PrintName(); } }
2. 在派生类中调用基类构造函数。
从静态方法中使用 base 关键字是错误的。
base 主要用于面向对象开发的对态这方面,在示例2中有体现。
以下是 this 的常用用途:
限定被相似的名称隐藏的成员
将对象作为参数传递到其他方法
声明索引器
示例:
// this 关键字 // keywords_this.cs using System; class Employee { private string _name; private int _age; private string[] _arr = new string[5]; public Employee(string name, int age) { // 使用this限定字段,name与age this._name = name; this._age = age; } public string Name { get { return this._name; } } public int Age { get { return this._age; } } // 打印雇员资料 public void PrintEmployee() { // 将Employee对象作为参数传递到DoPrint方法 Print.DoPrint(this); } // 声明索引器 public string this[int param] { get { return _arr[param]; } set { _arr[param] = value; } } } class Print { public static void DoPrint(Employee e) { Console.WriteLine("Name: {0} Age: {1}", e.Name, e.Age); } } class TestApp { static void Main() { Employee E = new Employee("Hunts", 21); E[0] = "Scott"; E[1] = "Leigh"; E[4] = "Kiwis"; E.PrintEmployee(); for (int i = 0; i < 5; i++) { Console.WriteLine("Friends Name: {0}", E[i]); } Console.ReadLine(); } }