【问题标题】:C# Namespaces inside classes?类中的 C# 命名空间?
【发布时间】:2016-02-09 10:30:46
【问题描述】:

不知道如何解释,所以我会尽量提供尽可能详细的信息。 我正在制作一个网络库,我需要为我的 NetClient 类提供一个部分,例如此示例中的 Headers

NetClient netClient = new NetClient("host", port);
netClient.Headers.Add("Name", "Value");

我认为这会起作用,但它不起作用(在 NetClient 类的实例中根本看不到 Headers 类):

namespace NetLib
{
    class NetClient
    {
        public string Host { get; }
        public int Port { get; }

        public NetClient(string host, int port)
        {
            this.Host = host;
            this.Port = port;
        }

        class Headers
        {
            class Header
            {
                public string Name { get; }
                public string Value { get; }

                internal Header(string name, string value)
                {
                    this.Name = name;
                    this.Value = value;
                }
            }



我在提交的答案的帮助下解决了我的问题,这就是我的代码现在的样子:

   public sealed class NetClient
   {
        public string Host { get; set; }
        public int Port { get; set; }
        public Headers Headers { get; private set; }


        public NetClient(string host, int port)
        {
            this.Headers = new Headers();
            this.Host = host;
            this.Port = port;
        }
    }

    public sealed class Headers
    {
        public class Header
        {
            public string Name { get; }
            public string Value { get; }

            internal Header(string name, string value)
            {
                this.Name = name;
                this.Value = value;
            }
        }

【问题讨论】:

  • 这是NetClient的完整源码吗?您似乎正在尝试使用嵌套类(标题)作为属性。
  • 你刚刚定义了类。您只能访问静态成员。要访问实例成员,您必须创建该类的属性。所以你必须在 NetClient 中也有 Headers 的实例
  • 这不是完整的代码,但我认为不需要其余的。我知道我可以在 NetClient 中创建一个 Headers 成员,但是有什么办法可以绕过它吗?
  • 只有当你像@m-kazem-akhgary 所指出的那样将标题设为静态时。但是如果不查看其余代码,就无法判断这是否会对您有所帮助。到目前为止提供的大多数答案似乎都是更好的解决方案。

标签: c# class namespaces


【解决方案1】:

将一个类放在另一个类中并不会使其成为该类的实例成员(甚至是静态成员),它只会影响该类的命名和范围。

要获取实例成员,您需要类的实际成员,例如作为标题项列表的属性:

namespace NetLib {

  class Header {

    public string Name { get; }
    public string Value { get; }

    public Header(string name, string value) {
      this.Name = name;
      this.Value = value;
    }

  }

  class NetClient {

    public string Host { get; private set; }
    public int Port { get; private set; }
    public List<Header> Headers { get; private set; }

    public NetClient(string host, int port) {
      this.Host = host;
      this.Port = port;
      this.Headers = new List<Header>();
    }

  }

}

用法:

NetClient netClient = new NetClient("host", port);
netClient.Headers.Add(new Header("Name", "Value"));

您可以将Header 类放在NetClient 类中,但是您需要使用new NetClient.Header(...) 而不是new Header(...)

【讨论】:

  • 这有助于以我想要解决的方式解决我的问题,我只是更改了其中的一些内容。谢谢。现在我可以这样做:netClient.Headers.Add("Name", "Value");
【解决方案2】:

下面的代码能满足你的需要吗?

public sealed class NetClient
{
    public string Host { get; set; }
    public int Port { get; set; }
    public Headers Headers { get; private set; }

    public NetClient(string host, int port)
    {
        Host = host;
        Port = port;

        Headers = new Headers();
    }
}

public sealed class Headers : Dictionary<String, String>
{
}

【讨论】:

    【解决方案3】:

    尝试将其公开,因为默认情况下类是“内部的”,内部的成员/变量是私有的。

    所以基本思想是创建内部实例,以便初始化类并在运行时创建对象。请不要照原样复制粘贴,因为我没有使用VS进行整改。

    我觉得应该更像:

    NetClient netClient = new NetClient("host", port); netClient.Headers=netclient.CreateObjHeaders("Name", "Value");

    命名空间 NetLib { 类 NetClient { 公共字符串主机{获取; } 公共 int 端口 { 获取; }

        public NetClient(string host, int port)
        {
            this.Host = host;
            this.Port = port;
        } 
    
        public Headers CreateObjHeaders(string Name, string Value)
        { 
            Headers objHeaders=new Headers("Name", "Value");
            return objHeaders;
        }
        public class Headers
        {
           public Headers(string Name, string Value)
           { 
               Header objHeader=new Header("Name", "Value"); 
           }
    
           public class Header
           {
                public string Name { get; }
                public string Value { get; }
    
                internal Header(string name, string value)
                {
                     this.Name = name;
                     this.Value = value;
                }
           }
    

    【讨论】:

    • 很遗憾对我不起作用,仍然看不到里面的课程。
    • 如果你没有定义access modifier,默认是私有的
    • 对于一个变量它是私有的,但对于一个类默认是内部的/
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多