您的位置:首页 > 编程语言 > C#

Learning hard C#学习笔记

2016-04-25 02:55 691 查看
委托:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateUse
{
// 委托使用演示
class Program
{
// 1. 使用delegate关键字来定义一个委托类型
delegate void MyDelegate(int para1, int para2);

static void Main(string[] args)
{
// 2. 声明委托变量d
MyDelegate d;
// 3. 实例化委托类型,传递的方法也可以为静态方法,这里传递的是实例方法
d = new MyDelegate(new Program().Add);

// 4. 委托类型作为参数传递给另一个方法
MyMethod(d);
Console.Read();
}

// 该方法的定义必须与委托定义相同,即返回类型为void, 两个int类型的参数
void Add(int para1, int para2)
{
int sum = para1 + para2;
Console.WriteLine("两个数的和为:"+sum);
}

// 方法的参数是委托类型
private static void MyMethod(MyDelegate mydelegate)
{
// 5.在方法中调用委托
mydelegate(1,2);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DelegateOrigin
{
class Program
{
static void Main(string[] args)
{
// 引入委托之后
// 初始化对象
Program p = new Program();
p.Greeting("李志", p.ChineseGreeting);
p.Greeting("Tommy Li", p.EnglishGreeting);
Console.Read();
}
#region 引入委托之后
// 定义委托类型
public delegate void GreetingDelegate(string name);
// 有了委托之后,可以像如下实现打招呼方法
public void Greeting(string name, GreetingDelegate callback)
{
// 调用委托
callback(name);
}

// 英国人打招呼方法
public void EnglishGreeting(string name)
{
Console.WriteLine("Hello,  " + name);
}

// 中国人打招呼方法
public void ChineseGreeting(string name)
{
Console.WriteLine("你好, " + name);
}
public void JapaneseGreeting(string name)
{
Console.WriteLine("こんにちは, "+name);
}
#endregion

#region 没有委托的情况
//// 不使用委托实现打招呼方法
//public void Greeting(string name,string language)
//{
//    switch (language)
//    {
//        case "zh-cn":
//            ChineseGreeting(name);
//            break;
//        case "en-us":
//            EnglishGreeting(name);
//            break;
//        default:
//            EnglishGreeting(name);
//            break;
//    }
//}

//// 英国人打招呼方法
//public void EnglishGreeting(string name)
//{
//    Console.WriteLine("Hello,  "+name);
//}

//// 中国人打招呼方法
//public void ChineseGreeting(string name)
//{
//    Console.WriteLine("你好, "+name);
//}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MulticastDelegates
{
class Program
{
// 声明一个委托类型
public delegate void DelegateTest();
static void Main(string[] args)
{
// 用静态方法来实例化委托
DelegateTest dtstatic = new DelegateTest(Program.method1);

DelegateTest dtinstance= new DelegateTest(new Program().method2);

// 定义一个委托对象,一开始初始化为null,就是不代表任何方法(我就是我,我不代表任何人)
DelegateTest delegatechain = null;

// 使用+符号链接委托,链接多个委托后就成为委托链了
delegatechain += dtstatic;
delegatechain += dtinstance;

// 使用-运算符把dtstatic委托从委托链中移除
delegatechain -= dtstatic;

// 调用委托链
delegatechain();
Console.Read();
}

// 静态方法
private static void method1()
{
Console.WriteLine( "这是静态方法");
}

// 实例方法
private void method2()
{
Console.WriteLine( "这是实例方法");
}
}
}


事件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventUse
{
// 新郎官类,充当事件发布者角色
public class Bridegroom
{
// 自定义委托
public delegate void MarryHandler(string msg);

// 使用自定义委托类型定义事件,事件名为BirthdayEvent
public event MarryHandler MarryEvent;

// 发出事件
public void OnBirthdayComing(string msg)
{
// 判断是否绑定了事件处理方法
if (MarryEvent != null)
{
// 触发事件
MarryEvent(msg);
}
}

static void Main(string[] args)
{
//初始化新郎官对象
Bridegroom bridegroom =new Bridegroom();

// 实例化朋友对象
Friend friend1 = new Friend("张三");
Friend friend2= new Friend("李四");
Friend friend3 = new Friend("王五");

// 使用+=订阅事件
bridegroom.MarryEvent+=new MarryHandler(friend1.SendMessage);
bridegroom.MarryEvent += new MarryHandler(friend2.SendMessage);

// 发出通知,此时订阅了事件的对象才能收到通知
bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
Console.WriteLine("------------------------------------");

// 使用-=取消订阅事件,此时李四将收不到通知
bridegroom.MarryEvent -= new MarryHandler(friend2.SendMessage);

// 使用+=订阅事件,此时王五可以收到通知
bridegroom.MarryEvent += new MarryHandler(friend3.SendMessage);

// 发出通知
bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
Console.Read();
}
}

// 朋友类
public class Friend
{
// 字段
public string Name;

// 构造函数
public Friend(string name)
{
Name = name;
}

// 事件处理函数,该函数需要符合MarryHandler委托的定义
public void SendMessage(string mssage)
{
// 输出通知信息
Console.WriteLine(mssage);

// 对事件做出处理
Console.WriteLine(this.Name + "收到了,到时候准时参加");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventUseInNET
{
// 新郎官类,充当事件发布者角色
public class Bridegroom
{
// 使用.NET类库中预定义的委托类型EventHandler来定义事件
public event EventHandler MarryEvent;

// 发出事件
public void OnBirthdayComing(string msg)
{
// 判断是否绑定了事件处理方法
if (MarryEvent != null)
{
Console.WriteLine(msg);

// 触发事件
MarryEvent(this,new EventArgs());
}
}

static void Main(string[] args)
{
//初始化新郎官对象
Bridegroom bridegroom = new Bridegroom();

// 实例化朋友对象
Friend friend1 = new Friend("张三");
Friend friend2 = new Friend("李四");
Friend friend3 = new Friend("王五");

// 使用+=订阅事件
bridegroom.MarryEvent += new EventHandler(friend1.SendMessage);
bridegroom.MarryEvent += new EventHandler(friend2.SendMessage);

// 发出通知,此时订阅了事件的对象才能收到通知
bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
Console.WriteLine("------------------------------------");

// 使用-=取消订阅事件,此时李四将收不到通知
bridegroom.MarryEvent -= new EventHandler(friend2.SendMessage);

// 使用+=订阅事件,此时王五可以收到通知
bridegroom.MarryEvent += new EventHandler(friend3.SendMessage);

// 发出通知
bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
Console.Read();
}
}

// 朋友类
public class Friend
{
// 字段
public string Name;

// 构造函数
public Friend(string name)
{
Name = name;
}

// 事件处理函数,该函数需要符合EventHandler委托的定义
public void SendMessage(object s, EventArgs e)
{
// 对事件做出处理
Console.WriteLine(this.Name + "收到了,到时候准时参加");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EventArgsExt
{
// 自定义事件类,使其带有事件数据
public class MarryEventArgs : EventArgs
{
public string Message;
public MarryEventArgs(string msg)
{
Message = msg;
}
}

// 新郎官类,充当事件发布者角色
public class Bridegroom
{
// 自定义委托类型,委托具有两个参数
public delegate void MarryHandler(object sender, MarryEventArgs e);

// 定义事件
public event MarryHandler MarryEvent;

// 发出事件
public void OnBirthdayComing(string msg)
{
// 判断是否绑定了事件处理方法
if (MarryEvent != null)
{
// 触发事件
MarryEvent(this, new MarryEventArgs(msg));
}
}

static void Main(string[] args)
{
//初始化新郎官对象
Bridegroom bridegroom = new Bridegroom();

// 实例化朋友对象
Friend friend1 = new Friend("张三");
Friend friend2 = new Friend("李四");
Friend friend3 = new Friend("王五");

// 使用+=订阅事件
bridegroom.MarryEvent += new MarryHandler(friend1.SendMessage);
bridegroom.MarryEvent += new MarryHandler(friend2.SendMessage);

// 发出通知,此时订阅了事件的对象才能收到通知
bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
Console.WriteLine("------------------------------------");

// 使用-=取消订阅事件,此时李四将收不到通知
bridegroom.MarryEvent -= new MarryHandler(friend2.SendMessage);

// 使用+=订阅事件,此时王五可以收到通知
bridegroom.MarryEvent += new MarryHandler(friend3.SendMessage);

// 发出通知
bridegroom.OnBirthdayComing("朋友们,我结婚了,到时候准时参加婚礼!");
Console.Read();
}
}

// 朋友类
public class Friend
{
// 字段
public string Name;

// 构造函数
public Friend(string name)
{
Name = name;
}

// 事件处理函数,该函数需要符合MarryHandler委托的定义
public void SendMessage(object s, MarryEventArgs e)
{
// 输出通知信息
Console.WriteLine(e.Message);

// 对事件做出处理
Console.WriteLine(this.Name + "收到了,到时候准时参加");
}
}
}


泛型:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _11._3__3
{
class Program
{
static void Main(string[] args)
{
// 每个封闭泛型类型都会调用其构造函数
GenericClass<int>.Print();
GenericClass<string>.Print();

// 对于非泛型类型,其构造函数只会调用一次
NonGenericClass.Print();
NonGenericClass.Print();
Console.Read();
}
}

// 泛型类
public static class GenericClass<T>
{
// 静态构造函数
static GenericClass()
{
Console.WriteLine("泛型的静态构造函数被调用了,实际类型为:"+typeof(T));
}

// 静态方法
public static void Print()
{
}
}
// 非泛型类
public static class NonGenericClass
{
static NonGenericClass()
{
Console.WriteLine("非泛型的静态构造函数被调用了");
}

public static void Print()
{
}
}
}


可空类型、匿名方法、迭代器:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _12._1
{
class Program
{
static void Main(string[] args)
{
// 下面代码也可以这样子定义int? value=1;
Nullable<int> value = 1;

Console.WriteLine("可空类型有值的输出情况:");
Display(value);
Console.WriteLine();
Console.WriteLine();

value = new Nullable<int>();
Console.WriteLine("可空类型没有值的输出情况:");
Display(value);
Console.Read();
}

// 输出方法,演示可空类型中的方法和属性的使用
private static void Display(int? nullable)
{
// HasValue 属性代表指示可空对象是否有值
Console.WriteLine("可空类型是否有值:{0}", nullable.HasValue);
if (nullable.HasValue)
{
Console.WriteLine("值为: {0}", nullable.Value);
}

// GetValueOrDefault(代表如果可空对象有值,就用它的值返回,如果可空对象不包含值时,使用默认值0返回)相当与下面的语句
// if (!nullable.HasValue)
// {
// result = d.Value;
// }

Console.WriteLine("GetValueorDefault():{0}", nullable.GetValueOrDefault());

// GetValueOrDefault(T)方法代表如果 HasValue 属性为 true,则为 Value 属性的值;否则为 defaultValue 参数值,即2。
Console.WriteLine("GetValueorDefalut重载方法使用:{0}", nullable.GetValueOrDefault(2));

// GetHashCode()代表如果 HasValue 属性为 true,则为 Value 属性返回的对象的哈希代码;如果 HasValue 属性为 false,则为零
Console.WriteLine("GetHashCode()方法的使用:{0}", nullable.GetHashCode());
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _12._2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("??运算符的使用如下:");
NullcoalescingOperator();
Console.Read();
}
// ??运算符的演示
private static void NullcoalescingOperator()
{
int? nullable = null;
int? nullhasvalue = 1;

// ??和三目运算符的功能差不多的
// 所以下面代码等价于:
// x=nullable.HasValue?b.Value:12;
int x = nullable ?? 12;

// 此时nullhasvalue不能null,所以y的值为nullhasvalue.Value,即输出1
int y = nullhasvalue ?? 123;
Console.WriteLine("可空类型没有值的情况:{0}", x);
Console.WriteLine("可空类型有值的情况:{0}", y);

// 同时??运算符也可以用于引用类型, 下面是引用类型的例子
Console.WriteLine();
string stringnotnull = "123";
string stringisnull = null;

// 下面的代码等价于:
// (stringnotnull ==null)? "456" :stringnotnull
// 也也等价于:
// if(stringnotnull==null)
// {
//      return "456";
// }
// else
// {
//      return stringnotnull;
// }

// 从上面的等价代码可以看出,有了??运算符之后可以省略大量的if—else语句,这样代码少了, 自然可读性就高了
string result = stringnotnull ?? "456";
string result2 = stringisnull ?? "12";
Console.WriteLine("引用类型不为null的情况:{0}", result);
Console.WriteLine("引用类型为null的情况:{0}", result2);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _12._3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("可空类型的装箱和拆箱的使用如下:");
BoxedandUnboxed();
Console.Read();
}

// 可空类型装箱和拆箱的演示
private static void BoxedandUnboxed()
{
// 定义一个可空类型对象nullable
Nullable<int> nullable = 5;
int? nullablewithoutvalue = null;

Console.Write(nullablewithoutvalue.Value);
// 获得可空对象的类型,此时返回的是System.Int32,而不是System.Nullable<System.Int32>,这点大家要特别注意下的
Console.WriteLine("获取不为null的可空类型的类型为:{0}", nullable.GetType());

// 对于一个为null的类型调用方法时出现异常,所以一般对于引用类型的调用方法前,最好养成习惯先检测下它是否为null
//Console.WriteLine("获取为null的可空类型的类型为:{0}", nullablewithoutvalue.GetType());

// 将可空类型对象赋给引用类型obj,此时会发生装箱操作,大家可以通过IL中的boxed 来证明
object obj = nullable;

// 获得装箱后引用类型的类型,此时输出的仍然是System.Int32,而不是System.Nullable<System.Int32>
Console.WriteLine("获得装箱后obj 的类型:{0}", obj.GetType());

// 拆箱成非可空变量
int value = (int)obj;
Console.WriteLine("拆箱成非可空变量的情况为:{0}", value);

// 拆箱成可空变量
nullable = (int?)obj;
Console.WriteLine("拆箱成可空变量的情况为:{0}", nullable);

// 装箱一个没有值的可空类型的对象
obj = nullablewithoutvalue;
Console.WriteLine("对null的可空类型装箱后obj 是否为null:{0}", obj == null);

// 拆箱成非可空变量,此时会抛出NullReferenceException异常,因为没有值的可空类型装箱后obj等于null,引用一个空地址
// 相当于拆箱后把null值赋给一个int 类型的变量,此时当然就会出现错误了
//value = (int)obj;
//Console.WriteLine("一个没有值的可空类型装箱后,拆箱成非可空变量的情况为:{0}", value);

// 拆箱成可空变量
nullable = (int?)obj;
Console.WriteLine("一个没有值的可空类型装箱后,拆箱成可空变量是否为null:{0}", nullable == null);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace _12._9
{
class Program
{
static void Main(string[] args)
{
// 创建一个对象
Friends friendcollection = new Friends();
// Friends实现了IEnumerable所以可以使用foreach语句进行遍历
foreach (Friend f in friendcollection)
{
Console.WriteLine(f.Name);
}

Console.Read();
}

// 朋友类
public class Friend
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Friend(string name)
{
this.name = name;
}
}

// 朋友集合
public class Friends : IEnumerable
{
private Friend[] friendarray;

public Friends()
{
friendarray = new Friend[]
{
new Friend("张三"),
new Friend("李四"),
new Friend("王五")
};
}

// 索引器
public Friend this[int index]
{
get { return friendarray[index]; }
}

public int Count
{
get { return friendarray.Length; }
}

// 实现IEnumerable<T>接口方法
public IEnumerator GetEnumerator()
{
return new FriendIterator(this);
}
}

//  C#1.0中实现迭代器代码——必须实现 IEnumerator接口
public class FriendIterator : IEnumerator
{
private readonly Friends friends;
private int index;
private Friend current;
internal FriendIterator(Friends friendcollection)
{
this.friends = friendcollection;
index = 0;
}

// 实现IEnumerator接口中的方法
public object Current
{
get
{
return this.current;
}
}

public bool MoveNext()
{
if (index + 1 > friends.Count)
{
return false;
}
else
{
this.current = friends[index];
index++;
return true;
}
}

public void Reset()
{
index = 0;
}
}
}
}


Lambda表达式:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _14._1
{
class Program
{
static void Main(string[] args)
{
// Lambda表达式的演变过程
// 下面是C# 1中创建委托实例的代码
Func<string, int> delegatetest1 = new Func<string, int>(Callbackmethod);

// ↓
// C# 2中用匿名方法来创建委托实例,此时就不需要额外定义回调方法Callbackmethod
Func<string, int> delegatetest2 = delegate(string text)
{
return text.Length;
};
// ↓
// C# 3中使用Lambda表达式来创建委托实例
Func<string, int> delegatetest3 = (string text) => text.Length;

// ↓
// 可以省略参数类型string,把上面代码再简化为:
Func<string, int> delegatetest4 = (text) => text.Length;

// ↓
// 此时可以把圆括号也省略,简化为:
Func<string, int> delegatetest = text => text.Length;

// 调用委托
Console.WriteLine("使用Lambda表达式返回字符串的长度为: " + delegatetest("learning hard"));
Console.Read();
}

// 回调方法
private static int Callbackmethod(string text)
{
return text.Length;
}
}
}
using System;
using System.Windows.Forms;

namespace _14._2
{
class Program
{
static void Main(string[] args)
{
// 新建一个button实例
Button button1 = new Button();
button1.Text = "点击我";

// C# 2中使用匿名方法来订阅事件
button1.Click += delegate(object sender, EventArgs e)
{
ReportEvent("Click事件", sender, e);
};
button1.KeyPress += delegate(object sender, KeyPressEventArgs e)
{
ReportEvent("KeyPress事件,即键盘按下事件", sender, e);
};

// C# 3之前初始化对象时使用下面代码
Form form = new Form();
form.Name = "在控制台中创建的窗体";
form.AutoSize = true;
form.Controls.Add(button1);
// 运行窗体
Application.Run(form);
}

// 记录事件的回调方法
private static void ReportEvent(string title, object sender, EventArgs e)
{
Console.WriteLine("发生的事件为:{0}", title);
Console.WriteLine("发生事件的对象为:{0}", sender);
Console.WriteLine("发生事件参数为: {0}", e.GetType());
Console.WriteLine();
Console.WriteLine();
}
}
}
using System;
// 引入Expression<TDelegate>类的命名空间
using System.Linq.Expressions;

namespace _14._6
{
class Program
{
// 构造a+b表达式树结构
static void Main(string[] args)
{
// 表达式的参数
ParameterExpression a = Expression.Parameter(typeof(int), "a");
ParameterExpression b = Expression.Parameter(typeof(int), "b");

// 表达式树主体部分
BinaryExpression be = Expression.Add(a, b);

// 构造表达式树
Expression<Func<int, int, int>> expressionTree = Expression.Lambda<Func<int, int, int>>(be, a, b);

// 分析树结构,获取表达式树的主体部分
BinaryExpression body = (BinaryExpression)expressionTree.Body;

// 左节点,每个节点本身就是一个表达式对象
ParameterExpression left = (ParameterExpression)body.Left;

// 右节点
ParameterExpression right = (ParameterExpression)body.Right;

// 输出表达式树结构
Console.WriteLine("表达式树结构为:"+expressionTree);
// 输出
Console.WriteLine("表达式树主体为:");
Console.WriteLine(expressionTree.Body);
Console.WriteLine("表达式树左节点为:{0}{4} 节点类型为:{1}{4}{4} 表达式树右节点为:{2}{4} 节点类型为:{3}{4}", left.Name, left.Type, right.Name, right.Type, Environment.NewLine);

Console.Read();
}
}
}
using System;
// 引入Expression<TDelegate>类的命名空间
using System.Linq.Expressions;

namespace _14._4
{
class Program
{
static void Main(string[] args)
{
// 将lambda表达式构造成表达式树
Expression<Func<int, int, int>> expressionTree = (a, b) => a + b;

// 获得表达式树参数
Console.WriteLine("参数1:{0},参数2: {1}", expressionTree.Parameters[0], expressionTree.Parameters[1]);
// 获取表达式树的主体部分
BinaryExpression body = (BinaryExpression)expressionTree.Body;

// 左节点,每个节点本身就是一个表达式对象
ParameterExpression left = (ParameterExpression)body.Left;

// 右节点
ParameterExpression right = (ParameterExpression)body.Right;

Console.WriteLine("表达式树主体为:");
Console.WriteLine(expressionTree.Body);
Console.WriteLine("表达式树左节点为:{0}{4} 节点类型为:{1}{4}{4} 表达式树右节点为:{2}{4} 节点类型为:{3}{4}", left.Name, left.Type, right.Name, right.Type, Environment.NewLine);
Console.Read();
}
}
}
using System;
// 引入Expression<TDelegate>类的命名空间
using System.Linq.Expressions;

namespace _14._5
{
class Program
{
static void Main(string[] args)
{
// 将lambda表达式构造成表达式树
Expression<Func<int, int, int>> expressionTree = (a, b) => a + b;
// 通过调用Compile方法来生成Lambda表达式的委托
Func<int,int,int> delinstance =expressionTree.Compile();
// 调用委托实例获得结果
int result = delinstance(2, 3);
Console.WriteLine("2和3的和为:" + result);
Console.Read();
}
}
}


动态类型:
using System;
using System.Dynamic;

namespace _18._1
{
class Program
{
static void Main(string[] args)
{
dynamic expand = new ExpandoObject();
// 动态绑定成员
expand.Name = "Learning Hard";
expand.Age = 24;
expand.Addmethod = (Func<int, int>)(x => x + 1);
// 调用类型成员
Console.WriteLine("expand类型的姓名为:" + expand.Name + " 年龄为: " + expand.Age);
Console.WriteLine("调用expand类型的动态绑定的方法:" + expand.Addmethod(5));
Console.Read();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: