【问题标题】:Correct way of using a Structure in C# [closed]在 C# 中使用结构的正确方法 [关闭]
【发布时间】:2017-10-18 05:47:15
【问题描述】:

我正在尝试处理一个简单的结构。我需要在结构中正确设置所有变量,这些变量稍后将用作连接字符串。我不会为列出的变量分配任何新值。我知道如何对类做同样的事情,但现在我想发现如何使用结构。另外,我在构造函数中不需要这些参数字符串 p1 等,但是没有它们,我会收到错误消息。请帮忙)

public struct ConnectionString
{
    // vars declaration
    public string ip, login, password;

    // struct constructor
    public ConnectionString(string p1, string p2, string p3)
    {
        ip = "192.168.1.1";
        login = "boris";
        password = "123456";
    }
}

但是当我调用它时,我得到了一个空输出:

ConnectionString ss = new ConnectionString();
Console.WriteLine("connection string: " + ss.password);

【问题讨论】:

  • 好的,但是你的问题是什么?你有什么问题? 为什么你要为此使用结构?
  • “如何使用结构来做到这一点”:不是。结构用于特殊情况,这不是其中之一。值类型语义在这里没有用。
  • 另外,带有 camelCasing 的公共字段打破了多个规则。
  • 您正在创建 ConnectionString 对象而不使用 3 参数构造函数,因此当然不会填充任何对象。
  • @DiegoSlinger 我不确定你在回复什么,但这并没有回答我提出的任何问题,也没有提供我没有的任何新信息。

标签: c# struct


【解决方案1】:
// struct constructor
public ConnectionString(string p1, string p2, string p3)
{
    ip = "192.168.1.1";
    login = "boris";
    password = "123456";
}

但是当我调用它时,我得到了一个空输出:

ConnectionString ss = new ConnectionString();
Console.WriteLine("connection string: " + ss.password);

你没有调用你定义的构造函数;您正在调用隐式生成的默认构造函数,这就是没有填充任何字段的原因。

编辑:从documentation,请注意以下几点:

在结构声明中,字段不能被初始化,除非它们被声明为 const 或 static。

选项:

1) 删除您的构造函数并声明字段const 并提供值,即

public struct ConnectionString
{
    // vars declaration
    public const string ip = "192.168.1.1";
    public const string login = "boris";
    public const string password = "123456";
}

2) 在调用默认构造函数后填充这些字段,

3) 调用你定义的构造函数(带参数),

4)(最好的选择)不要使用结构来解决这个问题。

参考:Using Structs (C# Programming Guide)

【讨论】:

  • 没问题。如果您愿意接受,请考虑点击答案旁边的绿色复选标记。
【解决方案2】:

由于你没有使用里面的构造函数传递的参数,你可以如下所示调用它。 As others have already commented, getting connection string is not something, you should do with struct. Structs 通常用于一组相关参数和功能要共同使用的情况,并且可以作为设置用于较小的调用范围。它们是按值传递的,而不是按引用传递的。

ConnectionString connect = new ConnectionString("","","");
Console.WriteLine("connection string: " + connect.password);

【讨论】:

    【解决方案3】:

    代替:

    public ConnectionString(string p1, string p2, string p3) .....
    

    使用:

    public static ConnectionString Create()
    {
        return new ConnectionString { ip = "a", login = "b", password = "c" };
    }
    

    并使用:

    ConnectionString ss = ConnectionString.Create();
    

    当然,这是假设您必须使用结构体。

    【讨论】:

    • 如果我像你说的那样调用构造函数: ConnectionString ss = new ConnectionString.Create();我得到一个错误严重性代码描述项目文件行抑制状态错误CS0426类型名称'Create'在类型'ConnectionString'中不存在SadRecreate
    • @DiegoSlinger 您必须在结构体ConnectionString 中添加代码(public static ConnectionString Create()......)。
    • 我的代码如下所示:namespace StarterProject { public struct ConnectionString { // vars 声明 public string ip, login, password; // 结构构造函数 public static ConnectionString Create() { return new ConnectionString { ip = "a", login = "b", password = "c" }; } } }
    • @DiegoSlinger 你仍然得到错误The type name 'Create' does not exist in the type 'ConnectionString' ?如果是,那我不知道。
    猜你喜欢
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    相关资源
    最近更新 更多