C#类似乎发生了一些奇怪的事情

时间:2014-08-05 18:09:08

标签: c#

我曾经能够这样做:

public class Something
{
    public class SomethingElse
    {
        public static class ThisThing
        {
            public static string aoidj {get;set;}
        }
    }
}

但它不再有效。

我想要的结果(以及我一直以来能做到的)是:

Something.SomethingElse somethingElse = new Something.SomethingElse();
somethingElse.ThisThing.aoidj = "yay";

Console.WriteLine(somethingElse.ThisThing.aoidj);

但那不再适用。它现在出现在ThisThing中,而不是somethingElse SomethingElse.,而不是{{1}}。

C#语言有变化吗?这种行为肯定是不同的,我不知道它什么时候改变了。

3 个答案:

答案 0 :(得分:3)

你需要这样做:

Something.SomethingElse.ThisThing.aoidj = "yay";

Console.WriteLine(Something.SomethingElse.ThisThing.aoidj);

或以其他方式将您的代码更改为:

public class Something
{
        public class SomethingElse
        {
            public Whatever ThisThing = new Whatever();

            public class Whatever 
            {
                public string aoidj {get;set;}
            }
        }
}

然后你可以这样做(你的期望的结果):

Something.SomethingElse somethingElse = new Something.SomethingElse();
somethingElse.ThisThing.aoidj = "yay";

Console.WriteLine(somethingElse.ThisThing.aoidj);

答案 1 :(得分:3)

它必须出现在SomethingElse.中,否则,您如何访问它,它是Nested Type

C#没有以这种方式改变。嵌套类型始终可以通过其父类型访问。

请在此处查看我的回答:Cannot access nested classes or members of base class

此外,将静态类作为Nested Type没有意义,因为静态类更常用作管理器或提供者,因此它们主要用于系统的其他地方。

除此之外,如果您想访问静态类成员,则必须输入其名称并一劳永逸地访问它。

Something.SomethingElse.ThisThing.aoidj
  

但我做不到。这会很糟糕。我需要从somethingElse做到这一点。 Not SomethingElse。

比把它变成属性而不是类。

public class Something {
    public class SomethingElse {
        public OrEventSomethingElse ThisThing { get; set; }
    }
}

public class OrEventSomethingElse {
    public string aoidj { get; set; }
}

这样,您将无法通过Nested Type SomethingElse访问它,而只能通过实例访问它。

一些帮助您了解OOP的资源。

  

**我需要它成为一个班级,因为在ThisThing中有更多的东西**

将其设为SomethingElse之外的类,以便您可以将其作为简单的实例成员/属性进行访问。

public class ThisThing {
    public string Stuff { get; set; }
    public int SomeMoreStuff { get; set; }
    public DateTime EvenMoreStuff { get; set; }
    // ...
    public string ThisClassIsGettingHuge { 
        get {
            return "Time to refactor because big classes tend to break SRP";
        }
    }
}


public class Something {
    public class SomethingElse {
        public ThisThing ThisThingAsAProperty { get; set; }
    }
} 

然后,只有这样你才能访问你的实例。

var somethingElse = new Something.SomethingElse;
Console.WriteLine(somethingElse.ThisThingAsAProperty.ThisClassIsGettingHuge);

我已经开发了多年的信息和流程,我很少使用嵌套类型。它们通常会造成比他们帮助更多的伤害。

答案 2 :(得分:0)

没有任何改变,但你的代码是错误的。幸运的是我也找到了答案。

class Something
    {
        public class SomethingElse
        {
            public SomethingElse()
            {
            }
            public static class sm
            {
                public static void set()
                {
                }
            }
        }
    }

以这种方式使用该课程 -

Something.SomethingElse.sm.set();