C#中的partial,this关键字以及扩展方法

NO one
partial:C#允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中。
局部类型适用于以下情况:
(1) 类型特别大,不宜放在一个文件中实现。
(2) 一个类型中的一部分代码为自动化工具生成的代码,不宜与我们自己编写的代码混合在一起。
(3) 需要多人合作编写一个类。
局部类型的限制:
(1) 局部类型只适用于类、接口、结构,不支持委托和枚举。
(2) 同一个类型的各个部分必须都有修饰符 partial。
(3) 使用局部类型时,一个类型的各个部分必须位于相同的命名空间中。
(4) 一个类型的各个部分必须被同时编译。
代码示例:
// partial1.cs:
namespace CodeSamples
{
public partial class MyPartialClass
{
public int method1(int x)
{
Console.WriteLine(x);
return 0;
}
}
}
// partial2.cs
namespace CodeSamples
{
public partial class MyPartialClass
{
public void method2(double x)
{
Console.WriteLine(x);
}
}
}
// program.cs
static void Main(string[] args)
{
MyPartialClass obj = new MyPartialClass();
obj.method1(11);
obj.method2(34.23);
Console.Read();
}

NO Two
C#扩展方法
扩展方法的的一些概念:
扩展方法是你能够向现有类型添加方法,而无需创建新的派生类型、重新编译或以其它方式修改原始类型;扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用,对于C#而言,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异;扩展方法虽然被定义为静态方法,但它们是通过实例方法语法进行调用的,它们的第一个参数指定该方法作用于哪个类型,并且该参数以this修饰符为前缀,仅当你使用using指令将命名空间显式导入到源代码之后,扩展方法才位于范围中;

代码示例1:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
}
可使用using指令将WordCount扩展方法至于范围内:
using ExtensionMethods;
而且可以使用以下语法从应用程序中调用该扩展方法:
string s = "Hello Extension Methods";
int i = s.WordCount();

解答心中的疑惑点:在代码中,可以使用实例方法语法调用该扩展方法,但是编译器生成的中间语言会将转换为对静态方法的调用。因此,并未真正违反封装原则。扩展方法只能是访问所扩展类的public成员

为了方便理解:在看一个例子-->扩展方法的目的就是为一个现有类型添加一个方法,现有类型既可以是int,string等数据类型,也可以是自定义的数据类型。为数据类型的添加一个方法的理解:一般来说,int数据类型有个Tostring的方法,就是把int 数据转换为字符串的类型,比如现在我们想在转换成字符串的时候还添加一点东西,比如增加一个字符 a .那么之前的Tostring就不好使了,因为它只是它我们的int数据转换为string类型的,却并不能添加一个字母 a.所以这就要用到所谓的扩展方法了。

在编译时绑定扩展方法:
可以使用扩展方法来扩展类或接口,但不能重写扩展方法,与接口或类方法具有相同名称和签名的扩展方法永远不会被调用;编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。换句话说,如果某个类型具有一个名为 Process(int i) 的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

扩展方法:

1.方法所在的类必须是静态的
2.方法也必须是静态的
3.方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。
4.在第一个参数前面还需要有一个this关键字
参考:https://blog.csdn.net/zyh_1988/article/details/51103612
https://www.cnblogs.com/rinack/p/5695067.html

No Three

C#中的this关键字
1.this代表当前类的实例对象
2.用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();
}
}
}
}
3.应用于某一类型(原始类型或自定义)的扩展方法
4.通过this实现索引器,可用于优化程序性能

猜你喜欢

转载自www.cnblogs.com/wecc/p/11283939.html