Tag: 访问修饰符

如何使字段只在课外读取

我有以下类(示例): public class Dog { int numberOfTeeth; public Dog() { countTeeth(); } private void countTeeth() { this.numberOfTeeth = 5; //this dog has seen better days, apparently } } 在我创建狗对象后,它应该计算出牙齿的数量。 我希望能够访问该值,而无法在类本身之外修改它。 Dog d = new Dog(); int dogTeeth = d.numberOfTeeth; //this should be possible d.numberOfTeeth = 10; //this should not 但是,我无法弄清楚哪个访问修饰符会让我这样做。 我已经尝试了以下所有方法: 如果我将numberOfTeeth 私有 ,则无法访问它。 如果我将numberOfTeeth […]

序列化使用内部修饰符声明的类的List ?

我正在尝试将XML序列化添加到C#中相当简单的类结构中。 本质上,有一个根类的实例(称为AClass),它包含一些其他类的几个实例的List(称之为AnotherClass): [XmlRoot(“RootNode”)] public class AClass { [XmlElement(“ListNode”)] internal List otherObjects { get; set; } } public class AnotherClass { [XmlAttribute(“Name”)] internal string name { get; set; } } 在序列化时,我希望将这两个类序列化在一起 – 也就是说,如果我序列化了AClass,它的AnotherClass列表也会被序列化(请参阅此问题 )。 我有这个主要工作,但问题是在序列化期间,XmlSerializer似乎只想处理类的public属性 – 如果列表被声明为internal它根本不会序列化AnotherClass。 我尝试使程序集的内部对序列化程序可见: [assembly: System.Runtime.CompilerServices.InternalsVisibleTo(“System.Xml”)] 这似乎没有做任何事情。 有没有办法让XmlSerializer递归序列化内部声明的对象列表?

强制使用接口而不是声明中的具体实现(.NET)

在C ++中,您可以执行以下操作: class base_class { public: virtual void do_something() = 0; }; class derived_class : public base_class { private: virtual void do_something() { std::cout << "do_something() called"; } }; derived_class重写方法do_something()并将其derived_class private 。 结果是,调用此方法的唯一方法是这样的: base_class *object = new derived_class(); object->do_something(); 如果将对象声明为derived_class类型,则无法调用该方法,因为它是私有的: derived_class *object = new derived_class(); object->do_something(); // –> error C2248: ‘::derived_class::do_something’ : cannot access private […]

您是否曾见过合理使用受保护内部访问修饰符的设计?

我没有,但我不说没有。 阅读此内容的所有C#开发人员可能都知道内部受保护的内容以及何时使用它。 我的问题很简单:您是否真的使用过它,或者使用受保护的内部访问修饰符来处理成功设计的项目? 如果是的话,请分享您的知识并发布好的样本,我终于可以欣赏这个棘手的修饰符的巧妙使用。 //我相信这不是主观的,我实际上是在寻求答案;-)

C#中私有类的概念

除了Inner类之外,C#中是否可以存在私有类?

为什么要使用类级访问修饰符而不是对象级?

在使用C#时,我最近意识到我可以从Foo的静态函数调用Foo对象的私有函数,甚至可以从其他Foo对象调用。 在我了解了访问修饰符的所有内容后,这对我来说听起来很奇怪。 据我所知,当你做一些属于某种内部过程的事情时,你会把一个函数设为私有。 只有对象本身知道何时使用这些函数,因为其他对象不应该/不能控制对象的流。 是否有任何理由为什么同一类别的其他对象应该从这个非常简单的规则中排除? 根据要求,一个例子: public class AClass { private void doSomething() { /* Do something here */ } public void aFunction() { AClass f = new AClass(); f.doSomething(); // I would have expected this line to cause an access error. } }

C#中的默认访问修饰符

如果我将创建一个如下所示的新对象,默认情况下它具有哪个访问修饰符? Object objectA = new Object();