在Kathleen Dollard最近的博客文章中,她提出了一个在.net中使用嵌套类的有趣理由.但是,她还提到FxCop不喜欢嵌套类.我假设编写FxCop规则的人并不愚蠢,所以必须在该位置背后有推理,但我无法找到它.
我对C#比较陌生,每次我开始研究C#项目(我只用C#中几乎成熟的项目)我想知道为什么没有内部类?
也许我不明白他们的目标.对我来说,内部类 - 至少是私有内部类 - 看起来很像Pascal/Modula-2/Ada中的"内部程序":它们允许在较小的部分中分解主类以便于理解.
示例:这是大多数时间看到的内容:
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // ClassB is only used by ClassA
<some code>
}
}
public class ClassB
{
public DoSomething()
{
}
}
Run Code Online (Sandbox Code Playgroud)
由于ClassB只会被ClassA使用(至少有一段时间),我猜这个代码会更好地表达如下:
public class ClassA
{
public MethodA()
{
<some code>
myObjectClassB.DoSomething(); // Class B is only usable by ClassA
<some code>
}
private class ClassB
{
public DoSomething()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我很高兴收到你关于这个主题的消息 - 我是对的吗?
internal partial class Class1
{
private class Class2 : ISomething, ISomethingElse
{
private class Class3 : ISomething
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望Class3自己能够举办另一场私人活动Class4,但那会Class3太大,所以我想做出一些Class3偏见.我知道如何对非嵌套类进行此操作.如何在单独的文件中创建嵌套类?
我们可以在C#中使用嵌套类.这些嵌套类也可以继承OuterClass.例如:
public class OuterClass
{
// code here
public class NestedClass : OuterClass
{
// code here
}
}
Run Code Online (Sandbox Code Playgroud)
完全可以接受.
我们也可以在不将NestedClass作为OuterClass的嵌套类的情况下实现这一点,如下所示:
public class OuterClass
{
// code here
}
public class NestedClass : OuterClass
{
// code here
}
Run Code Online (Sandbox Code Playgroud)
我想知道,上面两个场景之间有什么区别?在方案I中可以实现什么,在方案II中无法实现?通过使NestedClass"嵌套"到OuterClasss,我们能得到更多的东西吗?
我的第一个问题:抽象类中受保护和公共构造函数之间的区别是什么?
我的第二个问题:如果抽象类有一个私有构造函数,它是否有意义?
提前致谢!
如何确保某个类仅由工厂实例化而不是直接调用new?
编辑:我需要工厂是一个单独的类(为了依赖注入目的)所以我不能使它成为实例化类的静态方法,所以我不能使新的私有.
从另一个类继承的类与作为其子类的类之间是否存在技术差异?以下代码中A和B之间的区别是什么:
一个)
public class foo {
...
private class bar {...}
}
Run Code Online (Sandbox Code Playgroud)
B)
public class foo { ...}
private class bar extends foo {...}
Run Code Online (Sandbox Code Playgroud) 我想为mvc页面制作一个这样的模型:
public class Body
{
public int Id { get; set; }
public class Hand
{
public List<Fingers> fingers { get; set; }
}
public class Foot
{
public List<Toes> toes { get; set; }
}
public class Head
{
public Nose nose {get; set;}
public List<Ears> ears { get; set; }
public List<Eyes> eyes { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后有一个像这样的手指类:
public class Fingers
{
public int Id { get; set; }
public string Description { get; set; } …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚实现某个API目标的正确语法是什么,但是我正在努力实现可见性.
我希望能够Messenger像访问实例的成员一样msgr.Title.ForSuccesses.
但是,我不希望能够Messenger.Titles从我的Messenger课外实例化.
我也愿意制作Messenger.Titles一个结构.
我猜我需要某种工厂模式或其他东西,但我真的不知道我该怎么做.
见下文:
class Program {
static void Main(string[] args) {
var m = new Messenger { Title = { ForErrors = "An unexpected error occurred ..." } }; // this should be allowed
var t = new Messenger.Titles(); // this should NOT be allowed
}
}
public class Messenger {
// I've tried making this private/protected/internal...
public class Titles {
public string ForSuccesses { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 所以我浏览了一些代码,我遇到了:
public class Person
{
private string message;
public override string ToString()
{
return message;
}
public static Person CreateEmployee()
{
return new Employee();
}
class Employee : Person
{
public Employee()
{
this.message = "I inherit private members!";
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释如何使用/访问私有变量"消息",即使它是私有的?
在 C# 中,为什么嵌套类必须实例化它的父类,以在代码中引用其父类的非静态属性?
public class OuterClass
{
public int OuterClassProperty
{
get
{
return 1;
}
}
public class InnerClass
{
public int InnerClassProperty
{
get
{
/* syntax error: cannot access a non-static
* member of outer type via nested type.
*/
return OuterClassProperty;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
看来我必须这样做:
public class OuterClass
{
public int OuterClassProperty
{
get
{
return 1;
}
}
public class InnerClass
{
public int InnerClassProperty
{
get
{
OuterClass ImplementedOuterClass = new OuterClass();
return …Run Code Online (Sandbox Code Playgroud) 我有一个名为GamePlay的ViewController类.在GamePlay中有一个名为MyPinAnnotationView的嵌套类.当调用MyPinAnnotation的方法TouchesBegan()时,我想从父GamePlay调用方法CheckAnswer().
我不想创建一个新的GamePlay实例,因为我已经设置了变量和实例.我可以通过某种方式访问父母吗?(除了事件监听器)
c# ×10
class ×3
nested-class ×3
oop ×3
.net ×2
inheritance ×2
nested ×2
asp.net-mvc ×1
factory ×1
fxcop ×1
iphone ×1
new-operator ×1
razor ×1
scope ×1
struct ×1
subclass ×1
syntax ×1