是一种扩展方法,类似于;新";c#中的关键字方法?
我们可以在扩展方法和继承之间有一些联系吗是一种扩展方法,类似于;新";c#中的关键字方法?,c#,.net,inheritance,extension-methods,new-operator,C#,.net,Inheritance,Extension Methods,New Operator,我们可以在扩展方法和继承之间有一些联系吗 或者是一种扩展方法,类似于在C#?中使用new-关键字,对这两个问题都是否定的。扩展方法实际上是将扩展操作的对象作为第一个参数的方法 new关键字用于为类的实例分配资源。扩展方法对实例进行操作,但不能作为新的替换,因为它需要一个实例(或该类型的null)作为第一个参数 考虑: public static class StringExtensions { public static string Reverse(this string _this)
或者是一种扩展方法,类似于在C#?中使用
new
-关键字,对这两个问题都是否定的。扩展方法实际上是将扩展操作的对象作为第一个参数的方法
new
关键字用于为类的实例分配资源。扩展方法对实例进行操作,但不能作为新的替换,因为它需要一个实例(或该类型的null
)作为第一个参数
考虑:
public static class StringExtensions
{
public static string Reverse(this string _this)
{
// logic to reverse the string
}
}
可以通过两种方式调用此静态方法:
// as an extension method:
string s = "hello world";
string t = s.Reverse();
// as a static method invocation:
string t = StringExtensions.Reverse(s);
无论哪种情况,编译器都会更改MSIL中的调用以映射第二个调用。编译之后,如果没有this
-关键字,您将无法从它的静态对应项中识别扩展方法
总结
- 扩展不是类的一部分
- 扩展与继承没有关系,事实上它们是静态方法,而不是继承的
- 扩展不能像
关键字那样实例化类(但在方法内部,您当然可以实例化类)new
- 扩展可以在
上操作,否则该类的方法将引发null
。这是因为实例只是静态方法中的第一个参数NullReferenceException
- 可以扩展密封类(如上面的
),这是通过继承无法实现的(不能从密封类派生)string
Tigran和Floran暗示这个问题是关于的,我补充说它甚至可能是关于的 扩展方法与
new
关键字的任何含义都没有关系。然而,这里有一些相互关联的想法。我希望这不会让事情变得更复杂。如果是,请坚持“编辑”上面的部分)
- 在新修改器上:
- 新修改器用于隐藏现有方法。扩展方法永远不能隐藏现有方法,因为声明是静态方法。这样做时,您甚至不会得到编译时警告或错误
- 新修改器要求方法(或属性)已存在且可访问。只有当具有相同签名的方法不存在时,扩展方法才能工作
- 新的修饰符通过继承对类的扩展进行操作,即每个方法都已被继承。扩展方法在类的实例上操作,并且与类没有继承关系
- 关于新的通用约束:
// this ext. method will only operate on classes that inherit // from ICollectible and have a public parameterless constructor public static int CalculateTotal<T>(this T _collectible) where T : ICollectible, new() { // calculate total }
- 该约束将允许的泛型类型限制为具有可访问的无参数构造函数的泛型类型。扩展方法与泛型无关
- 扩展方法本身可以是泛型的,并且参数(即它所操作的允许类)可以受到新泛型约束的限制:
// this ext. method will only operate on classes that inherit // from ICollectible and have a public parameterless constructor public static int CalculateTotal<T>(this T _collectible) where T : ICollectible, new() { // calculate total }
//此ext.方法将仅对继承 //来自ICollectable并具有公共无参数构造函数 公共静态int CalculateTotal(此T_收藏品) 其中T:icollectable,new() { //计算总数 }
new
关键字来覆盖基类中的非虚拟和静态方法
public class A
{
public virtual void One();
public void Two();
}
public class B : A
{
public override void One();
public new void Two();
}
B b = new B();
A a = b as A;
a.One(); // Calls implementation in B
a.Two(); // Calls implementation in A
b.One(); // Calls implementation in B
b.Two(); // Calls implementation in B
签出。扩展方法与继承或
new
关键字(或构造函数)无关。如果您想向一个没有源代码的类添加一些功能,它们可以提供更好的代码。如果您确实有源代码,它也可以工作,但是通常最好只更改源代码
例如,您可能希望能够做到这一点:
string text = "this is my string";
int count = text.WordCount();
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
String
类中不存在此方法,您需要这样做:
string text = "this is my string";
int count = MyCommon.WordCount(text);
其中WordCount()
是您的某种公共库中的静态方法
但通过扩展方法,您也可以做到这一点:
string text = "this is my string";
int count = text.WordCount();
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' },
StringSplitOptions.RemoveEmptyEntries).Length;
}
}
然后text.WordCount()
将像String
类中定义的普通方法一样工作。它只是让事情变得更好用
代码,我建议也阅读。我认为问题是关于的,正如habib.osu的回答中所述,而不是关于。除此之外,我同意你的回答。
new
是关于会员的shadowing@Florin/@Tigran:这是可能的,尽管我没有从问题中读到这一点。在这方面,它也可能是关于通用约束new()
。我想只有RDK能说明这一点。我会更新我的答案。@Abel:问题是阴影很容易与重载混淆,但我不认为new object()
会与OOP概念混淆。@Tigran:现在讨论的是重载;)。这是另一个密切相关的角度。重载是关于具有相同名称的不同签名,而new
只能隐藏具有完全相同签名的方法。但我同意OP的意思比我最初写的更可能是这个意思。欢迎来到SO。如果你能解释一下这三个选项中的哪一个可能会对我们有所帮助