【问题标题】:I can access private members in a copy ctor in C# [duplicate]我可以在 C# 的复制 ctor 中访问私有成员 [重复]
【发布时间】:2013-01-25 11:17:39
【问题描述】:

可能重复:
Why and how does C# allow accessing private variables outside the class itself when it’s within the same containing class?

这已经完全让我不知所措了,显然下面的代码是合法的,更令人惊讶的是从框架 2 开始是合法的......

public class Magic
{
    private readonly int _anInt;
    private readonly string _aString;

    public Magic(int anInt, string aString)
    {
        _anInt = anInt;
        _aString = aString;
    }

    public Magic(Magic toCopy)
    {
        _anInt = toCopy._anInt; // Legal!
        _aString = toCopy._aString; // Legal!
    }

    public void DoesntWorkMagic(Magic toCopy)
    {
        _anInt = toCopy._anInt; // edit: Will work if not readonly. 
        _aString = toCopy._aString;
    }

    public int AnInt { get { return _anInt; } }

    public string AString { get { return _aString; } }
}

发生了什么事?这些年来,我看到这么多复制构造函数做多余的工作,在我遇到它之前我不会相信这项工作。它的使用是否有任何注意事项(除了明显的线程问题)?

【问题讨论】:

  • 好吧,引用MSDN on the private modifierThe private modifier makes a member of a class visible only within that **class**. 注意它是怎么说的class,而不是instance...
  • 我看不出代码有什么问题,除了你可能改用MemberwiseClone()
  • 如果您有兴趣,Scala 有一个修饰符 (private[this]),可以让您使字段只能被同一个实例访问。 (这是所知道的唯一一种语言。)
  • 附带说明的是,通常(松散地)使用 FromX(X x) 形式的静态成员比“复制构造函数”更可取(仅基于我在 .NET 世界的经验) ,没有任何参考资料或任何东西)。
  • @GrantThomas:Objective-C 使用类似的东西,例如 NSArray 的initWithArray

标签: c#


【解决方案1】:

private 不是对象级别的,是类级别的,所以同一个类的对象知道它们的私有方面,所以允许在同一个类的其他对象上更改私有的东西。

private 防止其他类型在他们不应该去的地方闲逛。

【讨论】:

  • 我稍微改变了这个问题。现在有一个方法 :DoesntWorkMagic 不允许访问。
  • 如下所述,如果我没有将其设为只读,它将起作用。
【解决方案2】:

C# 中没有“复制构造函数”。只有构造函数。

在您的代码中,您有参数 toCopy,它是当前类 Magic 的一个实例。因此,由于它是同一个类,您可以访问私有字段 toCopy._anInttoCopy._aString(它是一个修饰符,使该字段在同一类的所有实例中可见)。

当您在构造函数中时,您可以设置新实例的字段_anInt_aString

readonly关键字只是说:“这个字段只能在实例的构造函数中设置。

【讨论】:

  • 是的,现在看看编辑,看看不是构造函数的方法不会编译。我称它为复制构造函数,因为它正在复制源对象,对其私有成员的访问仅在构造函数中可用,而不能从其他方法中访问。
  • 虽然您对 C++ 复制构造函数感到困惑。是的,DoesntWorkMagic 不会编译,因为 readonlyDoesntWorkMagic 不是构造函数)而不是因为 private
  • C# 中没有自动生成的复制构造函数,但是您可以自己编写一个,正如这篇 Microsoft 文章所述:msdn.microsoft.com/en-us/library/ms173116%28v=vs.110%29.aspx
  • 说真的,我觉得我刚刚注意到矩阵中的一个小故障。好像这在昨天是完全不可能的,而今天却不是。我一直将 _ 用于私人成员,因此可能这就是为什么我不会通过智能感知看到它们可用的原因。马特,我只是使用术语“复制构造函数”,因为该示例是一个复制构造函数,而我的原始示例很糟糕,所以我没有意识到私有成员可以从非 ctor 的方法访问。生活和学习:)
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2014-05-30
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多