C# 我可以在C中的副本中访问私有成员#

C# 我可以在C中的副本中访问私有成员#,c#,C#,可能重复: 这完全超越了我的理解,显然下面的代码是合法的,更令人惊讶的是从框架2开始是合法的 public class Magic { private readonly int _anInt; private readonly string _aString; public Magic(int anInt, string aString) { _anInt = anInt; _aString = aString; }

可能重复:

这完全超越了我的理解,显然下面的代码是合法的,更令人惊讶的是从框架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; } }
}
发生什么事了?这些年来,我见过这么多复制构造函数做过大量的工作,直到我遇到它,我才相信这项工作。它的使用是否有任何警告(除了明显的线程问题)?

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

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

在构造函数中,可以设置新实例的
\anInt
\aString
字段

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

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

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

在构造函数中,可以设置新实例的
\anInt
\aString
字段


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

私有不是对象级别,而是类级别,因此同一类的对象知道其私有方面,因此允许更改同一类的其他对象上的私有内容


private防止其他类型在它们不应该去的地方乱翻。

private不是对象级别,而是类级别,因此同一类的对象知道它们的私有方面,因此允许更改同一类的其他对象上的私有内容



private防止其他类型在它们不应该去的地方乱翻。

好吧,引用:
private修饰符使类的一个成员仅在该**类**中可见。
注意它如何表示class,而不是instance…我看不出代码有任何错误,只是您可能使用了
MemberwiseClone()
相反。如果您感兴趣,Scala有一个修饰符(
private[this]
),允许您仅对同一实例访问字段。(这是我所知道的唯一一种语言。)一个附带说明是,按照惯例(松散地),使用
FromX(X X)
形式的静态成员比使用“复制构造函数”(仅基于我在.NET世界的经验,没有任何引用或任何东西)更可取。@GrantThomas:Objective-C使用类似的东西,例如NSArray的
initWithArray
。好吧,引用:
私有修饰符使类的一个成员仅在该**类**中可见。
注意它如何表示类,而不是实例……我看不出代码有任何错误,除了您可能会使用
MemberwiseClone()
。如果您感兴趣,Scala,有一个修饰符(
private[this]
),可以使字段仅对同一实例可访问。(这是我所知道的唯一一种语言。)一个附带说明是,按照惯例(松散地),使用
FromX(X X)
形式的静态成员比使用“复制构造函数”(仅基于我在.NET世界的经验,没有任何引用或任何东西)更可取。@GrantThomas:Objective-C使用类似的东西,例如NSArray的
initWithArray
。我稍微改变了这个问题。现在有一种方法:DoesNetworkMagic,它不允许访问。正如下面指出的,如果我没有将其设置为只读,它将起作用。我稍微改变了这个问题。现在有一个方法:DoesntWorkMagic,它不允许访问。正如下面指出的,如果我没有将其设置为只读,它将工作。是的,现在看看编辑,看看这个方法,它不是一个不会编译的构造函数。我把它称为复制构造函数,因为它是复制源对象,对它的私有成员的访问只能在构造函数中获得,而不是其他方法。我认为您与C++复制构造函数混淆。是的,DoesntWorkMagic不会编译,因为它是只读的(DoesntWorkMagic不是一个构造函数),而不是因为私有的。C#中没有自动生成的复制构造函数,但是你可以自己编写一个,正如这篇微软文章所解释的:说真的,我觉得我刚刚注意到了矩阵中的一个小故障。好像这在昨天是完全不可能的,而今天不是。我一直为私人成员使用u,所以这可能就是为什么我不会通过intellisense看到它们可用的原因。Matt,我只是使用了术语“复制构造函数”,因为这个示例是一个复制的构造函数,而我的原始示例很糟糕,所以我没有意识到可以从非构造函数的方法访问私有成员。生活和学习:)是的,现在看看编辑,看看这个方法,它不是一个不会编译的构造函数。我把它称为复制构造函数,因为它是复制源对象,对它的私有成员的访问只能在构造函数中获得,而不是其他方法。我认为您与C++复制构造函数混淆。是的,DoesntWorkMagic不会编译,因为它是只读的(DoesntWorkMagic不是一个构造函数),而不是因为私有的。C#中没有自动生成的复制构造函数,但是你可以自己编写一个,正如这篇微软文章所解释的:说真的,我觉得我刚刚注意到了矩阵中的一个小故障。好像这在昨天是完全不可能的,而今天不是。我一直用u代表私人会员,所以这可能就是我为什么