C#中的匿名类

时间:2017-05-30 10:24:52

标签: c# class anonymous-class

在C ++中,我可以在一段代码中声明一个功能齐全的匿名类,如果我只需要它一次,我就不必声明它。

代码应该是这样的

Class MyClass
{
    Class
    {
        String string1;
        String string2;

        void MyMethod();
    } Strings;
}

并将其称为MyClass.Strings.string1MyClass.Strings.MyMethod()等成员。通过这种方式,我可以优雅地对代码进行分组。

有没有办法在C#中做同样的事情?

3 个答案:

答案 0 :(得分:4)

  

这样我就可以优雅地对我的代码进行分组。

我不知道如何帮助您优雅地对代码进行分组,但C#中没有这样的东西。有匿名类,但它们只在本地范围内工作:

// inside a method:
var obj = new { String1 = "Hello", String2 = "World" };

你无法为他们添加方法。

你最接近的是内部类/结构:

class MyClass
{
    class MyStrings
    {
        String string1;
        String string2;

        void MyMethod() { ... }
    } 
    MyStrings Strings;
}

答案 1 :(得分:1)

我同意扫地车。此功能只会添加混乱的代码。您应该考虑使代码尽可能简单易懂。这意味着如果你想要对你的代码进行分组,让每个组都拥有自己的功能,为什么不把这个组织变成一个类,并给它一个直接反映它的用途的名称。

你可以做的是使用一个匿名类,它在C#中不会实现任何接口,只是派生自object

var a = new { MyMember = 1, MyFunc = new Func<int>(() => 1) };

现在您可以调用此类型的两个成员:

Console.WriteLine(a.MyMember);
var retVal = a.myFunc();

但这是否会让您的代码更容易理解它的作用?我对此表示怀疑。给你的实例 - 甚至一次使用 - 一个描述他们的意图 - 背后的想法 - 的名称。不要让其他人通过加密来理解你的代码。

除此之外,你可以 - 正如其他人所说的那样 - 实现,没有其他人使用你的类只是让它在另一个类中私有 - 也就是你的类嵌套到另一个类中:

public class MyClass
{
    private class Strings { /* ... */ }
}

现在,您的类只能在MyClass内(以及当然嵌套在MyClass中的其他类中)可见。这使得无法从外部访问该类,如下所示:

var strings = new MyClass.Strings();

答案 2 :(得分:0)

尝试使内部类静态。这样您就可以使用您描述的语法:

class MyClass {
    public static Strings {
        public static string string1;
        public static string string2;
        public static void MyMethod() {}
    }
}

然后,您可以致电:MyClass.Strings.string1 = "Hell, world!";