[英]What is the purpose of 'this' keyword in C#
由于在方法内声明的变量仅在该方法中可用,并且在类中声明为private的变量仅在类中可用。 this
关键词的目的是什么? 为什么我要拥有以下内容:
private static class SomeClass : ISomeClass
{
private string variablename;
private void SomeMethod(string toConcat)
{
this.variablename = toConcat+toConcat;
return this.variablename;
}
}
当这将完成同样的事情:
private static class SomeClass : ISomeClass
{
private string variablename;
private void SomeMethod(string toConcat)
{
variablename = toConcat+toConcat;
return variablename;
}
}
练习我的打字技巧?
有几个案例很重要:
如果您有一个函数参数和一个具有相同名称的成员变量,您需要能够区分它们:
class Foo { public Foo(int i) { this.i = i; } private int i; }
如果您确实需要引用当前对象 ,而不是其中一个成员。 也许你需要将它传递给另一个函数:
class Foo { public static DoSomething(Bar b) {...} } class Bar { public Bar() { Foo.DoSomething(this); } }
当然,如果要返回对当前对象的引用,则同样适用
在你的例子中,它纯粹是一种品味问题,但这是一个不是这样的情况:
private string SomeMethod(string variablename)
{
this.variablename = variablename;
return this.variablename;
}
如果没有this
,代码将以不同的方式工作,将参数分配给自身。
在许多情况下这很有用。 这是一个例子:
class Logger {
static public void OutputLog (object someObj) {
...
}
}
class SomeClass {
private void SomeMethod () {
Logger.OutputLog (this);
}
}
这是另一个例子。 假设我正在编写一个输出对象的Stream.Out方法,并返回对流本身的引用,如下所示:
class Stream {
public Stream Out (object obj) {
... code to output obj ...
return this;
}
}
然后,可以在链接模式下使用此Out呼叫:
Stream S = new Stream (...);
S.Out (A). Out (B). Out (C);
除了“现场消歧”和“通过当前意义的参考”答案(已经给出)之外,还有一个额外的场景, this
是必要的; 来调用当前实例(我忽略了使用扩展方法this
在声明扩展方法,因为这是不太相同的意义的问题):
class Foo
{
public void Bar()
{
this.ExtnMethod(); // fine
ExtnMethod(); // compile error
}
}
static class FooExt
{
public static void ExtnMethod(this Foo foo) {}
}
公平地说,这不是常见的情况。 更可能的是简单地使代码更具可读性,例如:
public bool Equals(Foo other) {
return other != null && this.X == other.X && this.Y == other.Y;
}
在上面(或类似的Compare
, Clone
等),没有this.
我发现它有点......“不平衡”。
如果您的method-parameter与该字段具有相同的名称,则需要this
选项。
private string variablename;
private void SomeMethod(string variablename)
{
this.variablename = variablename+variablename;
return this.variablename;
}
在大多数情况下,使用this
简单的杂波的代码。 但是,我已经看到它被其他程序员使用,可能是为了触发本地成员的智能感知。
在扩展方法中也需要this
关键字。
public static class MyExtensions
{
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
}
首先,您的示例存在缺陷,因为您已将该类标记为静态,因此无法实例化。
无论如何, this
只是对当前实例的引用。 它可用于解决局部变量和成员变量之间的冲突,例如:
public class Foo
{
private string baz;
public void Bar(string baz)
{
this.baz = baz;
}
}
它本身也可以简单地用作对象,例如:
public class Foo
{
public List<Foo> GetList(string baz)
{
var list = new List<Foo>();
list.Add(this);
return list;
}
}
(不是说这个例子特别有用,但你明白了。)
编辑:一个更现实的例子是.NET中的事件模型:
public class Foo
{
public EventHandler SomeEvent;
public void Bar()
{
if (SomeEvent != null)
{
SomeEvent(this, EventArgs.Empty);
}
}
}
this
表示您当前的类实例成员没有 我想到的第一件事是可读性和/或个人偏好。
有时我正在使用一个相当大的类...或者一个带有基类的类(我无法“看到”某些变量)...我使用“this”关键字...至少在Visual Studio中使用intellisense 。
除了Javascript之外,“this”主要是一个占位符关键字,最有用的是在编写一段代码时使你的意图变得明显。
基本上它有助于提高可读性。
首先,当类方法需要将对象的引用传递给另一个类中的某个方法时, 这是必要的。
例如:
class Image
{
void Refresh()
{
Screen.DrawImage(this);
}
}
与使用或不使用“this”的其他场景不同。 是一种风格问题,或解决人为模糊的手段。
我恭敬地不同意其他一些海报。 在C#中,它不仅仅是品味问题; 它也符合微软的C#风格指南(内部和外部指导,尽管它们似乎并不符合内部的指导原则)。
有些例子表明您使用的符号不起作用:
private void DoSomething(object input)
{
input = input;
}
相反,您需要使用以下表示法:
private void DoSomething(object input)
{
this.input = input;
}
this
是指类的实例,在示例中,您向我们展示:您使用this
来引用名为variablename
的字段。
如果您有一个具有相同名称的局部变量或参数,则需要有一种区分它们的方法。 在这种情况下, this
将涉及到外地,而不是用前缀this
指的是局部变量或参数。
您应该有一个命名约定,可以帮助您区分字段和本地。 这样可以避免以后在方法中添加同名的本地时可能出现的问题。 (因为没有this
代码会破坏...)
这主要是一种风格问题。 如果您的方法的变量名称与私有类成员相同,则使用此名称有助于消除歧义。 这可能会阻止愚蠢的错误。
常用的是具有相同名称的构造函数参数:
public SomeClass(string variablename)
{
this.variablename = variablename;
}
1)首先,最重要的是,当一个对象需要传递对自身的引用时:
public class Element{
//...
public Element Parent;
public Element Root()
{
if( Parent == null )
return this;
return Parent.Root();
}
}
public void OnEvent()
{
Event(this, new EventArgs());
}
在流畅的界面:
public class Query {public Query Add(Parameter parameter){_ list.Add(parameter); 归还这个; }}
2)第二,在和扩展方法:
public class Extension
{
public Element Root(this Element element) {
if( element.Parent == null )
return element;
return element.Parent.Root();
}
}
3)第三,你真的不需要它,以区分参数和类成员。 您不需要它,因为良好的编码约定可以避免使用“this”关键字。
public class Element
{
public Element Parent;
publlc void SetParent(Element parent)
{
// this.Parent = parent; // see, you don't need it
Parent = parent;
}
}
//...
public class Element
{
public Element _parent;
public Element Parent { get { return _parent; } }
publlc void SetParent(Element parent)
{
// this._parent = parent; // see, you don't need it
_parent = parent;
}
}
有一个原则可以指导您决定是否使用'this'。 你需要具体参考这个类的实例吗? 如果你这样做,那么使用'this'。 否则,请将其留下。
Logger示例提供的另一张海报就是一个很好的例子。 他不能依赖于隐含的这一点,因为他需要对象本身。
在类本身中使用'this'作为类本身方法的前缀是没有意义的,因为它是隐式的。
我忍不住......
if (this == null)
throw new NullReferenceException();
[KIDDDIIIING!]
我已经找到的另一种情况:
private int value;
public int Value
{
get { return this.value; }
set { this.value = value; } //without this it doesn't make sense
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.