C# 部分语法总结(入门经典)
class Program
{
static void Main(string[] args)
{
init();
System.Console.ReadKey();
} #region 接口
/// <summary>
/// 接口成员是公共的,不能加其他修饰符,如static,public,virtual等
/// </summary>
public interface IA
{
string IStr { get; set; }
void IMethod();
} public interface IB
{
string IStr { get; set; }
void IMethod();
} #endregion #region B public class B
{
public virtual void Do()
{
System.Console.WriteLine("B -Do");
} public virtual void Go()
{
System.Console.WriteLine("B -Go");
} public void Say()
{
System.Console.WriteLine("B -Say");
}
}
#endregion #region C
public abstract class C : B
{
#region 私有成员
private int i = ;
#endregion #region 构造函数 public C()
{
System.Console.WriteLine("C()");
} public C(int i)
{
this.i = i;
System.Console.WriteLine("C(int i)");
} #endregion /// <summary>
/// 覆盖
/// </summary>
public override void Do()
{
System.Console.WriteLine("C -Do");
}
/// <summary>
/// 隐藏
/// </summary>
public new void Say()
{
System.Console.WriteLine("C -Say");
} /// <summary>
/// 覆盖和密封,sealed必须和override一起使用
/// </summary>
public override sealed void Go()
{
System.Console.WriteLine("C -Go");
} /// <summary>
/// 只读抽象属性,虚方法和抽象方法不能为private,抽象成员所属类只能是抽象类
/// </summary>
public abstract string AbStr { get; }
public abstract string AbMethod();
protected abstract void AbProtected(); }
#endregion #region D
/// <summary>
/// 类单继承,接口多实现
/// </summary>
public class D : C, IA, IB, IComparable, IComparer
{
#region 私有成员
private int i = ;
private int timeCount = ;
/*默认是私有的*/
System.Timers.Timer aTimer;
#endregion #region 构造函数 this base
/*
* 在一开始掉用该类时,初始化一次
*/
/// <summary>
/// 静态构造函数,只能为私有的,不能有参数,不能被外部所更改
/// </summary>
static D()
{
System.Console.WriteLine("Static D()");
} /*
* 实例化是:从之类到父类传递值,并从父类到之类的实例化过程
*/
public D()
: this()
{
System.Console.WriteLine("D()");
} public D(int i)
: base(i)
{
//this关键字指向本类实例
this.i = i;
System.Console.WriteLine("D(int i)");
} #endregion #region 方法的覆盖、隐藏、密封 sealed new
public override void Do()
{
System.Console.WriteLine("D -do");
} public new void Say()
{
System.Console.WriteLine("D -Say");
} #endregion #region 实现父类抽象成员 override
/// <summary>
/// 基础父类抽象成员
/// </summary>
public override string AbStr
{
get
{
return "AbStr";
}
}
/// <summary>
/// 基础父类抽象成员
/// </summary>
public override string AbMethod()
{
return "AbMethod";
}
/// <summary>
/// 访问级别只能小于等于保护级别,不能高于基类的访问级别
/// </summary>
protected override void AbProtected()
{
}
#endregion #region 索引器
/// <summary>
/// 索引器
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public string this[int i]
{
get
{
return "this[int i] " + i;
}
} /// <summary>
/// 索引器2
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
public string this[string i]
{
get
{
string r = string.Empty;
switch (i)
{
case "A":
r = "this[string i] A";
break;
case "B":
r = "this[string i] B";
break;
default:
break;
}
return r;
}
}
#endregion #region IA IB 接口成员
/// <summary>
/// 隐式调用,多个接口同名成员可用一个成员实现,访问级别必须为public
/// </summary>
public string IStr
{
get
{
return "";
}
set
{ }
}
/*接口二义性 分开实现同名接口成员,显示实现,不能用public等修饰符,通过实例转换为接口类型来调用相应的私用方法
例如:D d = new D();
((IA)d).IMethod();
((IB)d).IMethod();
*/
/// <summary>
/// 显示实现IA接口,
/// </summary>
void IA.IMethod()
{
System.Console.WriteLine("IA.IMethod()");
}
/// <summary>
/// 显示实现IB接口,分开实现同名接口成员
/// </summary>
void IB.IMethod()
{
System.Console.WriteLine("IB.IMethod()");
} #endregion #region 委托和事件 delegate event
//使用委托和事件比较典型的例子是:观察者模式
/*1.单独使用委托,代码封装性易用性较差。
*2.委托返回一般为void,根据委托链,返回最后一个方法执行的返回值
*/
public delegate string DgNoEvent(string str);
public DgNoEvent dgNoEvent; /*2.将委托与事件结合
* 一方面是为了封装性、易用性
* 另外一方面是防止通过调用委托变量,在外部调用该委托方法。方法应该在封装的方法内被触发
*/
public delegate string DgEventHandler(string str);
public event DgEventHandler dgEvent; public void DgGo()
{
if (dgEvent != null)
{
//同步调用
dgEvent("dgEvent");
//异步调用,部分代码执行时间过长,可能会影响程序执行。观察者用异步,这样就不影响发布者。
AsyncCallback callBack = new AsyncCallback(OnAddComplete);
//IAsyncResult iAsyncResult = dgEvent.BeginInvoke("AsyncdgEvent", callBack, null);
}
if (dgNoEvent != null)
dgNoEvent("dgNoEvent");
} void OnAddComplete(IAsyncResult asyncResult)
{
IAsyncResult result = (IAsyncResult)asyncResult;
string data = (string)asyncResult.AsyncState;
System.Console.WriteLine(data);
} #endregion #region 多线程互斥锁 lock
/*
* 多线程的资源争用情况,使用互斥锁,让线程等待
*/
public void OnStart()
{
try
{
aTimer = new System.Timers.Timer();
//同步调用
aTimer.Elapsed += OnTimedEvent;
aTimer.Interval = ;
aTimer.Enabled = true; }
catch (Exception ex)
{
System.Console.WriteLine("异常");
}
} void OnTimedEvent(object source, ElapsedEventArgs e)
{ lock (this)
{
//只循环两次
if (timeCount >= )
{
aTimer.Enabled = false;
aTimer.Elapsed -= OnTimedEvent;
return;
}
timeCount++;
for (int i = ; i < ; i++)
{
Thread.Sleep();
System.Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "停止" + i + "秒");
} }
}
#endregion #region lambda表达式、匿名方法
/*
* lambda 表达式是一个可用于创建委托对象或表达式树类型的匿名函数
(input parameters) => {statement;}
*/
delegate bool Lambda1NoEventHandler(string str);
delegate string Lambda2NoEventHandler(string str, int i);
delegate void Lambda0NoEventHandler();
public void LambdaAndAnonmous()
{
//lambda方式
Lambda0NoEventHandler l0 = () => System.Console.WriteLine("Lambda0");
Lambda1NoEventHandler l1 = (str) => str.Equals("A");
Lambda2NoEventHandler l2 = (str, i) => { System.Console.WriteLine(str); return ""; };
l0();
l1("A");
l2("lambda2", );
//匿名方法,匿名类型
/*
* var变量,编译器会去判断该类型
*/
var a = new { s = "", d = "" };
l2 = delegate(string str, int i)
{
System.Console.WriteLine(str);
return "";
};
l2("anonmous", );
}
#endregion #region 迭代器 GetEnumerator
/*实现该迭代器之后,可对该对象进行foreach遍历*/
public IEnumerator GetEnumerator()
{
yield return "";
yield return "";
yield return "";
} #endregion #region 比较 IComparer is typeof
#region IComparer Members public int Compare(object x, object y)
{
D d1 = (D)x;
D d2 = (D)y;
if (d1.i > d2.i)
return ;
if (d1.i == d2.i)
return ;
return -; } #endregion #region IComparable Members public int CompareTo(object obj)
{
D d1 = (D)obj;
if (i > d1.i)
return ;
if (i == d1.i)
return ;
return -;
} #endregion /*类型比较*/
public void CompareType()
{
D d = new D();
/*类型需完全一致*/
if (d.GetType() == typeof(C))
{
System.Console.WriteLine("d.GetType() == typeof(C)");
}
/*is 判断是否可以转换为指定类型*/
if (d is B)
{
System.Console.WriteLine("d is B");
}
} #endregion #region 运算符重载
/*加号两边参数要按顺序调用*/
public static string operator +(D d1, D d2)
{
string str = d1.GetType().ToString() + d2.GetType().ToString();
System.Console.WriteLine("operator +(D d1, D d2)");
return "str";
}
public static string operator +(D d, C c)
{
string str = c.GetType().ToString() + d.GetType().ToString();
System.Console.WriteLine("operator +(D d, C c)");
return "str";
}
public static string operator +(C c, D d)
{
string str = c.GetType().ToString() + d.GetType().ToString();
System.Console.WriteLine("operator +(C c, D d)");
return "str";
}
/*隐式的转换运算符 D d=0; */
public static implicit operator D(int i)
{
D d = new D();
d.i = i;
return d;
}
/*显示的转换运算符 D d=(D)"0";*/
public static explicit operator D(string str)
{
D d = new D();
d.IStr = str;
return d;
}
#endregion #region 可空类型和??空接合运算符
public void Nullable()
{
int? i = null;
int j = i ?? ;
}
#endregion #region 泛型default和各种约束
/*
* T:有一个无参数构造函数
* K:必须是值类型
* L:必须是引用类型
* M1-M2:M1和M2必须类型相同,或者M1继承至M2
* N:N和C必须类型相同,或者继承至C
* N2:N2必须实现IA接口
*/
public T Tnew<T, K, L, M1, M2, N, N2>()
where T : new()
where K : struct
where L : class
where M1 : M2
where N : C
where N2 : IA
{
/*赋予默认值,数值型为0,类为null等*/
return default(T);
}
#endregion #region 变体:协变(out)和抗变(in)
/*
* 协变和抗变只能用在引用类型上面,不能用在值类型上面。
* 协变和抗变只能用在泛型委托和泛型接口上面。
*/
public interface IIndex<out T>
{
T this[int index] { get; }
int Count { get; }
}
public class RectangleBase { public int ID { get; set; } }
public class Rectangle : RectangleBase { public string Name { get; set; } }
public class RectangleCollection : IIndex<Rectangle>
{
List<Rectangle> list = new List<Rectangle>();
public Rectangle this[int index]
{
get
{
if (index < || index > Count)
throw new ArgumentOutOfRangeException("index");
return list[index];
}
}
public int Count { get { return list.Count; } }
public void Add(Rectangle value) { list.Add(value); }
}
public void Variance()
{
D d = new D();
var list = new RectangleCollection();
list.Add(new Rectangle { ID = , Name = "" });
list.Add(new Rectangle { ID = , Name = "" });
list.Add(new Rectangle { ID = , Name = "" });
//使用了out关键字,可以转换为base类型
IIndex<RectangleBase> Bas = list;
IIndex<Rectangle> Basa = list;
for (int i = ; i < Bas.Count; i++)
{
System.Console.WriteLine(Bas[i].ID);
}
System.Console.Read();
} #endregion #region 初始化器、匿名类型、类型查找Var
/*
* 不用新建一个多个参数的构造函数
*/
public void InitMethod()
{
/*类初始化器*/
D d = new D()
{
i = ,
IStr = "a"
};
/*集合*/
//普通方法
int[] s3 = new int[];
s3[] = ;
s3[] = ;
//集合初始化器
int[] s = new int[] {
,,,,,
};
int[] s2 = {
,,,,,
};
/*匿名类型*/
var a = new { s = "", d = "" };
var ass = new[] { new { s = "", d = "" }, new { s = "", d = "" } };
string str = a.s;
} #endregion #region 动态查找 dynamic
public dynamic Getdynamic()
{
if (i == )
return new B();
else
return new D();
}
#endregion #region 高级方法参数:可选参数、参数不固定、传递值类型的引用 out ref
//可选值只能位于方法的末尾,不能放置于没有默认值的参数之前
void HightlevelArg(int i, bool b = true, bool c = false)
{
HightlevelArg();
HightlevelArg(, false);
//也可以这么调用,跳过中间参数
HightlevelArg(, c: true);
}
/*参数数组,可变个数的参数*/
void Args(params int[] i)
{
int length = i.Count();
//这么调用
Args(, , , );
}
/*
* out:必须在方法体内初始化
* ref:必须在外部初始化
*/
void ArgsOutIn(out int i, ref int j)
{
//out 在方法体内初始化
i = ;
} #endregion #region 扩展方法,表达式树
/*静态类 静态方法 第一个参数 this string obj */
public void Expression()
{
Expression<Func<int, int, int>> expression = (a, b) => a * b + ;
dynamic f = Getdynamic();
}
#endregion }
#endregion #region init()
public static void init()
{
/*1.抽象,继承,封装,覆盖,隐藏,密封,实例化,静态构造函数,实现*/
B b = new B();
b.Do();
b.Say();
b.Go(); D d = new D();
d.Do();
d.Say();
d.Go(); b = d;
b.Do();
b.Say();
b.Go(); /*2.调用私有的显示实现接口的成员*/
((IA)d).IMethod();
string abStr = d.AbStr; /*3.索引器*/
System.Console.WriteLine(d["A"]);
System.Console.WriteLine(d["B"]);
System.Console.WriteLine(d[]); /*4.委托和事件*/
d.dgNoEvent = new D.DgNoEvent(GGG);
//可以直接调用,失去了委托意义,是不符合正道的。
d.dgNoEvent("dgNoEvent outSide the Delegate");
//这样才是正道
d.dgEvent += GGG; /*5.lambda表达式建立对象
() => SomeMethod()
*/
d.dgEvent += strParam =>
{
System.Console.WriteLine(strParam + " by lambda ");
return "";
};
/*6.匿名方法,建立委托对象 */
// 通过使用匿名方法,由于您不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。
var a = new { s = "", d = "" };
d.dgEvent += delegate(string str)
{
System.Console.WriteLine(str + " by 匿名委托对象 ");
return "";
};
d.DgGo(); /*7.多进程互斥锁*/
d.OnStart();
} private static string GGG(string str)
{
System.Console.WriteLine(str);
return "";
}
#endregion
}
C# 部分语法总结(入门经典)的更多相关文章
- 强烈推荐visual c++ 2012入门经典适合初学者入门
强烈推荐visual c++ 2012入门经典适合初学者入门 此书循序渐进,用其独特.易于理解的教程风格来介绍各个主题,无论是编程新手,还是经验丰富的编程人员,都很容易理解. 此书的目录基本覆盖了Wi ...
- 《c#入门经典第五版》简介及pdf电子书网盘下载地址(收藏)
<C#入门经典(第5版)>全面讲解C# 2010和.net架构编程知识,为您编写卓越C# 2010程序奠定坚实基础.C#入门经典系列是屡获殊荣的C#名著和超级畅销书.最新版的<C#入 ...
- 【推荐图书】+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等
[推荐图书]+ 基于Nios II的嵌入式SoPC系统设计与Verilog开发实例+C#入门经典等 3赞 发表于 2016/7/4 21:14:12 阅读(1921) 评论(3) 初次接触FPGA,到 ...
- 【C#入门经典视频教程】-第001课-C#入门-认识C#
C#入门-认识C# C ---> C++ --> C# (C++++) j++ j++ 有一门可能比这个C#更流行的语言 java 使用的教程:c#入门经典第五版 操作系统:windows ...
- c语言入门经典(第5版)
文章转载:http://mrcaoyc.blog.163.com/blog/static/23939201520159135915734 文件大小:126MB 文件格式:PDF [点击下载] C ...
- 【mssql】SQL Server2012编程入门经典(第四版)(上) 读书笔记
数据库用了很久了,但好多东西很容易忘记,这次头脑发热想起来读一遍书,做点笔记! 从第五章开始参考:<SQL Server 2005 编程入门经典>学习笔记 一.RDBMS基础:SQL Se ...
- Oracle编程入门经典 第12章 事务处理和并发控制
目录 12.1 什么是事务处理... 1 12.2 事务处理控制语句... 1 12.2.1 COMMIT处理... 2 12.2.2 RO ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- Java Web入门经典扫描版
全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门.不可不知的客户端应用技术.驾驭JavaWeb开发环境.JavaWeb开发必修课之JSP语法等内容:第二篇为“核心篇”,主要 ...
随机推荐
- VS2010项目的部署与安装
VS2010项目的部署与安装 转自:http://www.cnblogs.com/smile-wei/archive/2012/07/06/2579607.html winform程序,我想进行安装. ...
- tablediff使用方法
tablediff -sourceserver "db0093\sql2008" -sourcedatabase "testly" -sourcetable & ...
- 关于git中git pull --rebase中的一些坑
在公司里面,每次我更改完代码,准备pull最新代码时,总是会遇到各种各样的问题.,因为对应的问题不同,解决方法很多.但是比较通用的办法还是有的: git pull --rebase //报错时 g ...
- jquery 中substring,substr,split的用法
substring 方法 返回位于 String 对象中指定位置的子字符串. strVariable.substring(start, end) 参数 start 指明子字符串的起始位置,该索引从 0 ...
- [转载] 深入理解Android之Java虚拟机Dalvik
本文转载自: http://blog.csdn.net/innost/article/details/50377905 一.背景 这个选题很大,但并不是一开始就有这么高大上的追求.最初之时,只是源于对 ...
- 解决:eclipse 非正常关闭,导致无法正常启动
eclipse 无法正常启动: !ENTRY org.eclipse.ui.navigator 4 2 2016-09-07 11:23:54.181 !MESSAGE 从插件调用代码时出现问题:“o ...
- java--UDP屏幕广播代码
1.发送端的代码 这里广播的地址只写了一个 package com.udp.broadcast; import java.awt.Robot; import java.awt.image.Buffer ...
- modelsim无法识别include文件的解决方法
modelsim发现include关联的文件编译报语法错误,文件名需要写绝对路径,即使这个文件和工程其它文件在一个目录上.例如只写成 `include "c0_ddr3_model_para ...
- Android-MediaRecorder-音频录制-警告-W/MediaRecorder(13811): mediarecorder went away with unhandled events
Android-MediaRecorder-音频录制-警告-W/MediaRecorder(13811): mediarecorder went away with unhandled events ...
- LoadRunner参数更新方法和数据分配
参数化的定义:使用指定的数据源中的值来替换脚本录制生成的语句中的参数. 对Vuser脚本进行参数化的好处: 1.减小脚本的大小 2.提供了使用不同的脚本的值执行脚本的能力 参数化涉及两个任务: 1.用 ...