Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 你什么时候使用“this”关键字?_C#_Coding Style_This - Fatal编程技术网

C# 你什么时候使用“this”关键字?

C# 你什么时候使用“this”关键字?,c#,coding-style,this,C#,Coding Style,This,我很好奇其他人是如何使用这个关键词的。我倾向于在构造函数中使用它,但我也可能在整个类的其他方法中使用它。一些例子: 在构造函数中: public Light(Vector v) { this.dir = new Vector(v); } 别处 public void SomeMethod() { Vector vec = new Vector(); double d = (vec * vec) - (this.radius * this.radius); } 我每次引

我很好奇其他人是如何使用这个关键词的。我倾向于在构造函数中使用它,但我也可能在整个类的其他方法中使用它。一些例子:

在构造函数中:

public Light(Vector v)
{
    this.dir = new Vector(v);
}
别处

public void SomeMethod()
{
    Vector vec = new Vector();
    double d = (vec * vec) - (this.radius * this.radius);
}

我每次引用实例变量时都使用它,即使我不需要这样做。我认为它使代码更加清晰。

我在任何明显存在歧义的地方使用它。在这种情况下,不仅需要编译器的模糊性,还需要查看代码的人的模糊性。

我倾向于在字段下面加上uu,因此实际上不需要使用此选项。另外,R也倾向于重构它们…

您应该始终使用它,我使用它来区分私有字段和参数,因为我们的命名约定声明我们不使用前缀作为成员和参数名称,它们基于在internet上找到的信息,因此,我认为最好的练习

我只在绝对必要的时候使用它,即当另一个变量遮蔽另一个变量时。例如:

class Vector3
{
    float x;
    float y;
    float z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

}

或者正如Ryan Fox指出的,当您需要将其作为参数传递时。当您需要引用当前对象时,局部变量优先于成员变量

一个特别方便的场景是当您的对象正在调用一个函数并希望将自己传递给它时

例如:

void onChange()
{
    screen.draw(this);
}

我几乎只在从同一类型中引用类型属性时才使用它。正如另一位用户所提到的,我还强调了本地字段,因此它们不需要这样做就可以被注意到。

这取决于我使用的编码标准。如果我们使用u来表示一个实例变量,那么这就变得多余了。如果我们不使用uu,那么我倾向于使用它来表示实例变量。

我也倾向于在任何地方使用它,只是为了确保我们处理的是实例成员。

我不能相信所有人都说使用它总是一种最佳实践等等

当存在歧义时(如中),或需要将对象作为参数传递时(如中),请使用此选项。没有理由使用它,因为能够基于范围链解析变量应该足够清楚,不需要使用它限定变量

编辑:关于这个的C文档表明,除了我提到的两个之外,this关键字还有一个用法-


编辑:@Juan:Huh,我没有发现我的语句中有任何不一致之处-有3个实例我会使用C文档中记录的this关键字,而这些都是您实际需要它的时候。在没有阴影的情况下,在构造函数中的变量前面粘贴此选项只会浪费击键时间和阅读时间,没有任何好处。

我会在任何时候告诉我使用它。必须服从。哦,是的。

我不是有意让这听起来很刺耳,但这没关系

真的

看看那些重要的事情:你的项目,你的代码,你的工作,你的个人生活。它们中的任何一个的成功都不取决于您是否使用this关键字来限定对字段的访问。此关键字不能帮助您按时发货。它不会减少bug,也不会对代码质量或可维护性产生任何明显的影响。这不会给你加薪,也不会让你在办公室的时间减少

这真的只是一个风格问题。如果你喜欢这个,那就用它。如果你没有,那就不要。如果您需要它来获得正确的语义,那么就使用它。事实上,每个程序员都有自己独特的编程风格。这种风格反映了特定程序员对于最美观的代码应该是什么样子的概念。根据定义,任何其他读取您代码的程序员都将拥有不同的编程风格。这意味着你总是会做一些别人不喜欢的事情,或者会做得不一样。在某个时刻,有人会读你的代码并抱怨一些事情


我不会为此烦恼的。我只想根据您自己的喜好确保代码尽可能美观。如果你问10个程序员如何格式化代码,你会得到大约15个不同的意见。更好的关注点是代码是如何分解的。事物抽象化了吗?我是否为事物选择了有意义的名称?有很多代码重复吗?有什么方法可以简化事情吗?我认为,正确处理这些事情将对您的项目、代码、工作和生活产生最大的积极影响。巧合的是,这可能也会导致另一个人抱怨最少。如果您的代码工作正常,易于阅读,并且考虑因素充分,那么其他人就不会仔细检查您如何初始化字段。他只是想使用你的代码,惊叹它的伟大,然后转向其他东西。

关键字在C中有几种用法

使对象从方法返回自身 . 在当前实例上调用扩展方法 使自己变成另一种类型 您可以通过在作用域中不使用同名的成员和局部变量来避免第一种用法,例如,通过遵循常见的命名约定,并使用属性Pascal case而不是字段camel case来避免与局部变量camel case发生冲突。在C 3.0中,可以使用将字段轻松转换为属性。

以下是我使用它的时间:

从类内访问私有方法以区分 在发生事件时,将当前对象传递给另一个方法或作为发送方对象 创建扩展方法时:D
我不将其用于私有字段,因为我在私有字段变量名称的前面加了下划线389;

就我个人而言,我试图在引用成员变量时始终使用此选项。它有助于澄清代码并使其更具可读性。即使没有歧义,有人第一次读我的代码并不知道,但是如果他们看到这个用法一致,他们就会知道他们是否在查看一个成员变量。

< P>我习惯了在VisualC++中自由使用它,因为这样做会触发智能的,我点击了“>”键,我就懒惰了。而且容易打字错误

但是我继续使用它,因为我发现它很方便,可以看到我调用的是成员函数而不是全局函数。

[C++]

我同意在必要时使用它。不必要地用它来装饰代码不是一个好主意,因为编译器不会在您忘记执行时警告您。这会给那些希望它一直存在的人带来潜在的困惑,也就是说,他们必须考虑它

那么,你什么时候会使用它?我刚刚查看了一些随机代码,发现了这些示例,我并不是在判断这些是否是好事情:

将自己传递给一个函数。 给自己分配一个指针或类似的东西。 浇铸,即上/下浇铸安全或其他,浇铸常量等。 编译器强制消除歧义。
你不应该使用这个,除非你绝对必须


不必要的长篇大论会带来惩罚。您应该努力使代码与需要的一样长,而不是更长。

我只在需要时才使用它,但由于单参数多态性,对称操作必须放在单侧的方法中:

boolean sameValue (SomeNum other) {
   return this.importantValue == other.importantValue;
} 
[C++]

这在赋值运算符中使用,其中大部分时间您必须检查并防止程序出现意外、危险或浪费时间的情况,例如:

A a;
a = a;
您的分配运算符将被写入:

A& A::operator=(const A& a) {
    if (this == &a) return *this;

    // we know both sides of the = operator are different, do something...

    return *this;
}
这是一个C++编译器

如果编译器没有立即找到它,C++编译器将默默地查找它。有时候,大多数时候,这是好的:

如果没有在子类中重载母类的方法,则使用该方法。 将一个类型的值升级为另一个类型 但有时候,你只是不想让编译器猜。您希望编译器选择正确的符号,而不是另一个

对我来说,这些时间是指在方法中,我希望访问成员方法或成员变量的时间。我只是不想因为我写的是printf而不是print而随机选取一些符号。此->printf不会编译

关键是,对于C遗留库§、多年前编写的遗留代码§,或者在复制/粘贴已过时但仍处于活动状态的语言中可能发生的任何事情,有时告诉编译器不要耍花招是个好主意

这就是我使用这个的原因

§这对我来说仍然是一个谜,但我现在想知道,在源代码中包含头是否是所有遗留C库符号会污染全局名称空间的原因


§§意识到您需要包含标题,但是,包含此标头会破坏代码,因为它使用了一些具有通用名称的哑宏,这是程序员一生中的一个时刻

this关键字的另一个罕见用法是当您需要从实现类中调用显式接口实现时。下面是一个人为的例子:

class Example : ICloneable
{
    private void CallClone()
    {
        object clone = ((ICloneable)this).Clone();
    }

    object ICloneable.Clone()
    {
        throw new NotImplementedException();
    }
}

在JakubŠturc关于在构造函数之间传递数据的回答中,可能需要一些解释。这是在重载构造函数中出现的,并且是强制使用这种方法的一种情况。在下面的示例中,我们可以使用默认参数从无参数构造函数调用参数化构造函数

class MyClass {
    private int _x
    public MyClass() : this(5) {}
    public MyClass(int v) { _x = v;}
}

有时我发现这是一个特别有用的功能。

我使用它来调用Intellisense,就像,但我会在完成后返回并删除它。我遵循微软的惯例,在成员变量前面加上m_,因此将其作为文档保留是多余的。

1-常见Java setter习惯用法:

 public void setFoo(int foo) {
     this.foo = foo;
 }
2-将此对象作为参数调用函数时 仪表


“this.”有助于在“this”类中查找成员较多的成员,这通常是由于继承链较深

按CTRL+Space键对此没有帮助,因为它还包括类型;其中“this.”仅包括成员

我通常在得到我想要的东西后就删除它:但这只是我突破的风格


在风格方面,如果你是一个独行侠,你自己决定;如果你在一家公司工作,坚持公司政策,看看源代码管理中的东西,看看其他人在做什么。就用它来评定会员资格而言,两者都不是对的,也不是错的。唯一错误的是前后不一致——这是风格的黄金法则。让挑剔的人去挑剔别人。花时间思考真正的编码问题——显然是编码问题——取而代之。

我每次都在尽可能地使用它。我相信这会使代码更具可读性,更具可读性的代码就意味着更少的bug和更高的可维护性。

当您是许多开发人员在同一个代码库上工作时,您需要一些代码准则/规则。在我工作的地方,我们决定在字段、属性和事件上使用“this”


对我来说,这样做是有意义的,它使代码在区分类变量和方法变量时更容易阅读。

< P>有一个在C++中没有提到过的用法,那不是引用自己的对象或者从接收变量中消除成员的歧义。 可以使用此选项在继承自其他模板的模板类内将非依赖名称转换为参数依赖名称

template <typename T>
struct base {
   void f() {}
};

template <typename T>
struct derived : public base<T>
{
   void test() {
      //f(); // [1] error
      base<T>::f(); // quite verbose if there is more than one argument, but valid
      this->f(); // f is now an argument dependent symbol
   }
}
模板是使用两次传递机制编译的。在第一个过程中,仅解析和检查非参数相关名称,而仅检查相关名称的一致性,而不实际替换模板参数

在这一步中,没有实际替换类型,编译器几乎没有关于基是什么的信息。请注意,基模板的专门化可以将其转换为完全不同的类型,甚至是未定义的类型,因此它只假设它是一个类型。在这个阶段,对程序员来说似乎很自然的非依赖调用f是一个符号,编译器必须找到它作为派生名称空间的成员或在封闭名称空间中,这在示例中没有发生,它会抱怨

解决方案是将非依赖名称f转换为依赖名称。这可以通过两种方式来实现,即显式声明实现它的类型base::f-添加base会使符号依赖于T,编译器只会假设它将存在,并在参数替换后推迟第二次传递的实际检查


第二种方法是,如果您从具有多个参数或长名称的模板继承,则只需在符号之前添加一个this->。由于您正在实现的模板类确实依赖于它从基继承的参数,因此->依赖于参数,我们得到了相同的结果:在模板参数替换后的第二轮中检查->f。

我在接受对相同类型对象的引用的函数中使用它,我想说清楚我指的是哪个物体,在哪里

比如说

class AABB
{
  // ... members
  bool intersects( AABB other )
  {
    return other.left() < this->right() &&
           this->left() < other.right() &&

           // +y increases going down
           other.top() < this->bottom() &&
           this->top() < other.bottom() ;
  }
} ;
vs


乍一看,哪个AABB是正确的?这增加了一点澄清剂。

8。调用当前实例上的扩展方法this.Foo;将工作,但Foo也不会将自身强制转换为另一种类型,例如,将调用显式实现的方法,如ICollectionthis.Addbla.to,以将构造链接到同一类型中定义的另一个构造函数。公共类名…:这…@a并且它不会影响运行时的性能。假设没有歧义,不管您是编写this.someField=someValue还是someField=someValue,编译器的输出都是相同的。这可能会影响编译器的性能,因为编译器将以不同的方式解析源代码,但任何差异都肯定可以忽略不计。只有遵循样式约定,即属性不能与参数同名,才能通过属性访问字段,从而避免第一个问题。碰巧流行的C风格约定满足了这一要求。然而,并非所有的C都是根据该公约编写的。属性本身并没有什么固有的东西会使this关键字变得不必要;一个名为x的构造函数参数将隐藏一个名为x的成员,无论该成员是字段、属性还是事件confused@surfen这可以通过附加样式检查来避免,例如,在Java中,您可以使用Checkstyle并在完整构建后运行它,在任何流行的迭代/OO语言中都会有类似的功能tools@surfen好像你在模棱两可的情况下忘记了。我可以用这样的话来打破任何争论,但如果你忘记了……大多数人似乎从不阅读、优化或重写某些东西
e别人的代码!资格赛可以节省时间和动力!如果你看到任意一行代码,没有限定符就像魔术一样。我知道这是一篇很老的帖子,但是我不得不评论这个答案的讽刺,我恰好同意这个答案。在反对邪恶的匈牙利符号的圣战中,任何胆敢在成员变量前面加上m_的人都很快遭到了嘲笑,因为区分成员变量是没有用的或不必要的。@:有时你不能做某些事情,而有些人则不能。。。这让人困惑。。。我希望我永远不会在你的代码中工作。你不能总是认为将来阅读你的代码的人会理解你写的东西,你需要尽可能清楚,实现这一点的一个方法是consistent@juan10年后。你还认为这是一个好的做法吗@ScottAdams我仍然相信一致性和清晰性,是的,仅仅通过查看变量来确定变量的范围是局部变量还是成员变量如何?难道“这”不符合这个目的吗?或者你的意思是说,如果我们编写更小的方法,就很容易理解变量的范围了?ReSharper告诉我不要使用它。当我同时使用StyleCop和ReSharper时有点困惑:但我倾向于上面的Coreys答案,只有在绝对必要时才使用“this”关键字。@Gunnar,有一个选项可以禁用清除冗余的this。在里面R@EmperorAiman-是的,我知道。我的观点是,默认情况下,这两种流行的格式工具是不同的,这意味着两种不同的东西,这可能会让人困惑。生存还是毁灭…:this关键字在语义上是有意义的。见下文@JasonBunting的评论。你把这种风格的过度使用和它的实际用途混为一谈。你的话不仅轻率,而且是错误的!如果你有机会,你可能想重读我的答案。我将讨论如何在需要正确语义的情况下使用它。你可能还想看看起源问题。它在语义上不必要的示例中显示了用法。所以,我不确定我说的到底是错的。我的回答当然不是轻率的。你知道你的回答听起来怎么样吗?在我读到的字里行间,你怎么敢问这样的问题在我看来,这真的不是建设性的。没有人知道一切-这就是为什么我们有Stackoverflow:帮助别人和获得帮助。有些话题你知道,有些话题你知道。互相帮助,不要互相争斗。请想一想。我并不是想说得尖刻,但这是迄今为止最糟糕的答案之一。我看不出这与你的工作或个人生活相比有什么用处。仅仅因为有些事情不如其他事情重要并不意味着它们不重要。拥有一个一致的编程风格并不是不重要的。阅读一本关于代码可读性/可维护性的书,我想你可能误解了我的观点。这并不是说拥有一致的风格是不好的。我没有这样说。我的风格指南应该将“this.”作为所有字段访问的前缀吗?我希望尽可能地区分类变量,这样代码就更清晰了。我曾经使用前缀m_成员变量,例如私有字符串m_name。现在我只使用它,例如,如果我有类Test{private string a;public someMethod{this.a=foo;}},那么当您在MSDN中真正需要它时,我发现了很好的例子。请跟随-如果您必须理解、优化或重写其他人的代码(大多数代码编写得很糟糕),您会很乐意使用此限定符或任何其他限定符,以便从简单的外观中了解变量的范围,特别是省略了常量的类限定符、相同的包或层次结构或超级/基本限定符。使用像(u foo)这样常用的语法对我来说似乎并不优雅。按u键输入intellisense比输入此键更耗时。何必费心呢!使用eclipse自动保存格式功能,无需uu,以防您忘记了限定符。在阅读下面的答案和注释以及MSDN文档后:对于6年未更新的this关键字,我建议永远不要使用this关键字。这是毫无意义的。不要让参数使用相同的名称,这既混乱又愚蠢。你为什么要那样做?另外,在使用这个函数时不要传递实例,这也很混乱和愚蠢。在这种情况下,为什么不给构造函数的输入变量赋予不同的名称呢?
class AABB
{
  // ... members
  bool intersects( AABB other )
  {
    return other.left() < this->right() &&
           this->left() < other.right() &&

           // +y increases going down
           other.top() < this->bottom() &&
           this->top() < other.bottom() ;
  }
} ;
class AABB
{
  bool intersects( AABB other )
  {
    return other.left() < right() &&
           left() < other.right() &&

           // +y increases going down
           other.top() < bottom() &&
           top() < other.bottom() ;
  }
} ;