【问题标题】:What is the C# equivalent to PHP's "self::"?什么是 C# 等价于 PHP 的“self::”?
【发布时间】:2009-05-13 12:03:31
【问题描述】:

在 C# 中,当我想从该类的另一个静态方法调用该类的静态方法时,是否可以使用 通用前缀,例如 PHP 的 self::,而不是类名字?

所以在下面的例子中,不是说 Customer.DatabaseConnectionExists(),我怎么能说像 Self.DatabaseConnectionExists() 这样的话,例如以后如果我更改类的名称,我不必更改所有前缀?

class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public static Customer GetCurrentCustomer()
    {
        if (Customer.DatabaseConnectionExists())
        {
            return new Customer { FirstName = "Jim", LastName = "Smith" };
        }
        else
        {
            throw new Exception("Database connection does not exist.");
        }
    }

    public static bool DatabaseConnectionExists()
    {
        return true;
    }
}

【问题讨论】:

  • 我什么都不知道,但是你为什么不直接通过上下文菜单去“重构”——它同样可以让你免于手动编辑的麻烦
  • 对,但至少从我阅读 PHP 代码的经验来看,如果你看到“self::”,你就知道你引用了那个类,不管它叫什么,如果你看到“Customer::”你必须环顾四周,看看您是否确实在 Customer 类中。它只是让代码更明确一点,这是我以前经常看到的。

标签: c# oop


【解决方案1】:

没有真正的等价物 - 您必须指定类名,即

Customer.DatabaseConnectionExists()

或完全错过预选赛,即

DatabaseConnectionExists()

后一种调用方式是可取的,因为它更简单并且不会失去任何意义。此外,它与实例中的方法调用更加内联(即通过 InstanceMethod()not this.InstanceMethod() 调用,这过于冗长)。

【讨论】:

  • 我认为如果您使用“this”,它会使您的代码更易于阅读。例如方法和“类名”。对于静态方法,否则您不会通过查看方法调用来知道它是用于实例还是静态的。从 PHP 迁移到 C# 我觉得我经常需要在代码的上下文中环顾四周才能找出这种差异。
  • @Edward Tanguay:我明白你为什么会这样想,但实际上它太冗长了(至少在我看来)。您很少会看到使用 this.MethodName() 调用的方法,因为它违反了大多数设计准则。另一方面,this 与字段和属性的使用差异很大。
【解决方案2】:

如果您从类内部调用方法,则无需指定 ::Self 之类的任何内容,只需方法名称即可。

class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public static Customer GetCurrentCustomer()
    {
        if (DatabaseConnectionExists())
        {
            return new Customer { FirstName = "Jim", LastName = "Smith" };
        }
        else
        {
            throw new Exception("Database connection does not exist.");
        }
    }

    public static bool DatabaseConnectionExists()
    {
        return true;
    }
}

【讨论】:

  • 我写的是同样的答案 + 我们可以使用重构工具以防万一我们想更改类的名称。就个人而言,我使用“Resharper”重构工具。
【解决方案3】:

别管它了。 DatabaseConnectionExists 在类内部定义。

【讨论】:

    【解决方案4】:

    只要不带任何前缀就可以调用它。

    【讨论】:

      【解决方案5】:

      不,没有。但是使用重构工具,更改类的名称不必太担心。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-09-21
        相关资源
        最近更新 更多