C#中一些关键字和罕见类
1、@
在处理字符串时,那些个字符串转义字符我们可以使用这个,那@就是为解决这个而诞生的,直接让字符串原样输出有木有?什么sql字符串了,还有路径啥了的,统统搞定
string sql = @"select * from student where id = '001'";
//实际sql输出select * from student where id = '001'
string path = @"C:\MDocu\student.xml";
//实际path输出C:\MDocu\student.xml,注意这里可不是\\哦
如果字符串里边包含双引号时,要稍微处理一下,那就是在双引号的外边再加双引号即可
string s = @"He said,""yes""";
//s输出He said,"yes"
2、is
目的就一个,检查变量是不是给定的类型,是就返回true,不是就false
int i = ;
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 =,b=;
short myShort = checked((short)(a+b));
//error
short a =,b=;
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", "");
test.Add("B", "");
test.Add("C", ""); 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=,Name="LiSi",Age=}, new User{Id=,Name="ZhangSan",Age=} };
//获取特定人时所用的过滤条件,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(,));
//但如果用Lambda表达式:
Method m+=(a,b)=>a+b;
Console.WriteLine(m(,));
//可以省去方法的定义;实际上,Lambda表达式只是简化了匿名方法的语法而已。
附c#2.0的匿名方法语法:
Method m+=delegate(inta,int b){return a+b;};
Console.WriteLine(m(,));
class RefExample
{
static void Method(ref int i)
{
i = ;
}
static void Main()
{
int val = ;
Method(ref val); // val is now 44
}
}
public DataSet getData(out int count)
{
dataset ds=bll.getdata(,);
//获取第11条到第20条数据,但是不可能只显示共有10条记录吧,那么我们就可以用out了
int rcount=bll.GetCount();//比方说这个是取总记录数的
count=rcount;
return ds;
} //显示的时候
public void showdata()
{
int count=;
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 = ; i < list.Length; i++)
{ Console.WriteLine(list[i]); }
Console.WriteLine();
}
public static void UseParams2(params object[] list)
{
for (int i = ; i < list.Length; i++)
{ Console.WriteLine(list[i]); }
Console.WriteLine();
}
static void Main()
{
UseParams(, , );
UseParams2(, '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[] {,,};
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="",Code="zs",Name="张三"},
new User{ID="",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修饰符,那么整个类都将被视为静态类。
(1) 一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类,但如果指定,则必须相同。
(2) 局部类型上的接口具有“累加”效应。
partial class Class2: Iinterface1, Iinterface2 {}
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {} //相当于
class Class2: Iinterface1, Iinterface2, Iinterface3 {}
16、using
例如:
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();
}
}
public class A
{
public virtual void Hello()
{
Console.WiriteLine("Hello");
}
}
public class B : A
{
public override void Hello()
{
base.Hello();//调用基类的方法,显示Hello
Console.WiriteLine("World");
}
}
调用基类上已被其他方法重写的方法。
指定创建派生类实例时应调用的基类构造函数。
基类访问只能在构造函数、实例方法或实例属性访问器中进行。
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[];
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}\nAge: {1}", e.Name, e.Age);
}
}
class TestApp
{
static void Main()
{
Employee E = new Employee("Hunts", );
E[] = "Scott";
E[] = "Leigh";
E[] = "Kiwis";
E.PrintEmployee();
for (int i = ; i < ; i++)
{
Console.WriteLine("Friends Name: {0}", E[i]);
}
Console.ReadLine();
}
}
C#中一些关键字和罕见类的更多相关文章
- C#中Monitor类、Lock关键字和Mutex类
线程:线程是进程的独立执行单元,每一个进程都有一个主线程,除了主线程可以包含其他的线程.多线程的意义:多线程有助于改善程序的总体响应性,提高CPU的效率.多线程的应用程序域是相当不稳定的,因为多个线程 ...
- Java中final关键字修饰变量、方法、类的含义是什么
Java中的关键字final修饰变量.方法.类分别表示什么含义? 先看一个简单的介绍 修饰对象 解释说明 备注 类 无子类,不可以被继承,更不可能被重写. final类中的方法默认是final的 方法 ...
- java面向对象中的关键字
1,super关键字 super:父类的意思 1. super.属性名 (调用父类的属性) 2. super.方法名 (调用父类的方法) 3. super([参数列表])(调用父类的构造方法) 注意: ...
- Java中的关键字 transient
先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息 ...
- .net(C#)中this关键字
使用this关键字引用成员变量使用this关键字在自身构造方法内部引用其它构造方法使用this关键字代表自身类的对象使用this关键字引用成员方法 在一个类的方法或构造方法内部,可以使用"t ...
- js中this关键字测试集锦
参考:阮一峰<javascript的this用法>及<JS中this关键字详解> this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在 ...
- C++中explicit关键字的使用
看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅. 在C++中,我们有时可以将构造函数用作自动类型转换函数.但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++ ...
- 【有人@我】Android中高亮变色显示文本中的关键字
应该是好久没有写有关技术类的文章了,前天还有人在群里问我,说群主很长时间没有分享干货了,今天分享一篇Android中TextView在大段的文字内容中如何让关键字高亮变色的文章 ,希望对大家有所帮助, ...
- Java中native关键字
Java中native关键字 标签: Java 2016-08-17 11:44 54551人阅读 评论(0) 顶(23453) 收藏(33546) 今日在hibernate源代码中遇到了nati ...
随机推荐
- 2 实现第一个Django网站 博客
-1.理解上下文 render()渲染 request url传来的reuqest x.html 制定返回的模板名称 context 上下文 数据库中 替换数据 0.大框架 1.创建模板 (1 ...
- java.math.BigDecimal cannot be cast to java.lang.String解决方法
从mysql数据库里取decimal(18,2)封装到Map<String,String>中 BigDecimal b = new BigDecimal(resultMap.get(&qu ...
- 关于mac ox node安装报 npm ERR! registry error parsing json
想安装grunt 遇到2个问题 让npm重新设置一下config: npm config set registry http://registry.cnpmjs.org 然后还报 npm ERR! E ...
- Http状态码枚举(摘自 Microsoft 程序集 System.dll)
// 摘要: // 包含为 HTTP 定义的状态代码的值. public enum HttpStatusCode { // 摘要: // 等效于 HTTP 状态 100. System.Net.Htt ...
- 使用dib element proliant-tools制作deploy image
element proliant-tools会在ipa ramdisk中安装一个rpm包hpssacli(HP的RAID管理工具),和一个python module proliantutils(里面P ...
- ironic如何支持部署时按需RAID?
新浪大神推荐使用element proliant-tools制作deploy image.element proliant-tools会在ipa ramdisk中安装一个rpm包hpssacli(HP ...
- 批量部署ssh免密登陆
#!/bin/bash#set -xservers="10.254.192.xx10.254.192.xx10.254.192.xx"passwd="xxxxxxxx&q ...
- 原始套接字--icmp相关
icmp请求 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <uni ...
- android DOM解析Xml
文章转自:http://blog.sina.com.cn/s/blog_a661f16c0101d5qp.html People类是自己写的一个类,主要保存各个字符串数据. 由于没学过Xml语法只 ...
- [AGC005D] ~K Perm Counting [dp]
题面 传送门 思路 首先可以明确的一点是,本题中出现不满足条件的所有的数,都是分组的 只有模$K$意义下相同的数之间才会出现不满足条件的情况,而且仅出现在相邻的情况 那么我们考虑把这个性质利用起来 我 ...