C#如何像C++一样使所有内容都遵循public/private?

11

我最近开始学习C#,但我有一些C++的背景。我想知道如何做类似于:

class employee
{
    public:
       ....
  ... methods ...
       ....

    private:
       ....
    ... private member variables ....
       ....
}

我尝试用C#做这件事,但它不喜欢"public: ..."和"private: ..."来使其后的所有内容变成公共或私有。

另外,我看到C#中有一个"get"和"set"的东西,所以您不需要像以前一样创建一个私有成员变量,然后创建一个函数来返回该变量吗?

顺便问一下,在C#中如何创建子类?在C#中,新类会在不同的选项卡中打开,所以我不确定该如何操作。


1
这是一次在Stack Overflow上同时提出太多问题的做法,似乎您会从阅读有关C#的书籍中受益更多。我还建议您阅读SO FAQ(http://stackoverflow.com/faq#dontask)和此http://bit.ly/PerfectQuestion。 - Julian
http://stackoverflow.com/questions/46048/what-is-the-best-book-to-learn-c - ta.speot.is
4个回答

18

在C#中,你不能像在C++中那样使“块”公共或私有,你需要为每个成员添加可见性(和实现)。在C++中,通常会这样做:

public:
  memberA();
  memberB();
private:
  memberC();

在C++中,您可以将类的声明与实现分开,并在其他地方实现成员函数,而在C#中,则需要这样做:

public  memberA() { ...implement your function here... }
public  memberB() { ...implement your function here... }
private memberC() { ...implement your function here... }

关于属性,可以将其视为自动实现的setget方法,您可以选择自己实现或让编译器实现。如果要自主实现,您仍需要用字段存储数据;如果交给编译器处理,则它也会生成该字段。

继承的工作方式与将内容放在同一文件中完全相同(对于较大的C++项目甚至可能不是一个好主意)。只需像平常一样继承即可,只要您在同一命名空间中或者导入了基类命名空间,就可以轻松继承;

using System.Collections;  // Where IEnumerable is defined

public class MyEnumerable : IEnumerable {  // Just inherit like it 
   ...                                     // was in the same file.
}

4
很高兴你回答了这个“不是真正问题”的问题。我一直在看C++代码,没意识到在C#中无法进行块设置,这节省了我很多搜索时间! - Chris Cirefice

4

1) 在C#中,访问修饰符与C++不同,您需要明确为每个类成员指定一个。

http://msdn.microsoft.com/zh-cn/library/wxh6fsc7(v=vs.71).aspx

2) 您提到的get、set是指C#属性:

class User
{
    private string userName;

    public string UserName
    {
        get { return this.userName; }
        set { this.userName = value; }
    }
}

请注意,您还可以使用自动实现的属性。 http://msdn.microsoft.com/en-us/library/bb384054.aspx

3) 在C#中进行子类化的方法如下。

class Manager : Employee 
{
    //implementation goes here as usual
}

+1,但请注意您不需要显式地指定可访问性;有一个默认的可访问性。当然,任何显式的可访问性修饰符都仅适用于一个类型成员(或一个类型)。 - phoog
是的,那完全正确。如果没有明确定义,'Internal' 是类和结构体的默认访问级别。对于类成员而言:“通常,成员的可访问性不会超过包含它的类型的可访问性。”可以在 http://msdn.microsoft.com/en-us/library/ms173121.aspx 上阅读到相关信息。 - cgiacomi
类成员的默认可访问性是private;引文所说的略有不同:如果您给成员比其包含类更大的可访问性,则包含类的更严格的可访问性通常会防止在类不可访问的情况下访问该成员。换句话说,给定internal class C { public string P { get; set; } }P通常不会在程序集外部可见。 - phoog
然иҖҢпјҢдҪҝз”Ёinternal class C { private string P { get; set; } }пјҲжҲ–зӯүж•Ҳзҡ„internal class C { string P { get; set; } }пјүпјҢPеҜ№дәҺзұ»CеӨ–йғЁзҡ„д»Јз ҒжҳҜдёҚеҸҜи§Ғзҡ„гҖӮеҚідҪҝCжҳҜе…¬е…ұзҡ„пјҢPзҡ„й»ҳи®Өи®ҝй—®зә§еҲ«д№ҹжҳҜз§Ғжңүзҡ„гҖӮ - phoog

3
  1. 不行,C#中每个成员都必须指定访问器。

  2. 不用,它被称为属性

  3. 在另一个类中编写它。

class SomeClass
{

}
class SubClass:SomeClass {}

1
这不是子类,而是一个嵌套类 - Ken Wayne VanderLinde

3

在C#中,您需要为每个方法或属性指定访问修饰符。如果您不指定,它将采用默认的访问修饰符。
类成员的默认访问修饰符是private,而类外部的默认访问修饰符是internal。

class MyClass{ //MyClass will be internal
     int MyProperty {get; set;} // MyProperty will be privare
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接