公共领域很少是个好主意?

osh*_*nen 3 c# .net-3.5

显然,公共字段很少是一个好主意,并且不会对属性添加任何内容.

例如:

public class ClientGroupDetails
{
    public DateTime Col2;
    public String Col3;
    public Int32 Col4;

    public ClientGroupDetails(DateTime m_Col2, String m_Col3, Int32 m_Col4)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
        Col4 = m_Col4;
    }

    public ClientGroupDetails() { }
}

[WebMethod()]
public List<ClientGroupDetails> GetClientGroupDetails(string phrase)
{
    var client_group_details = new List<ClientGroupDetails>();

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"select col2, col3, col4 from table1 where col1 = @strSearch", connection))
        {
            command.Parameters.Add("@strSearch", SqlDbType.VarChar, 255).Value = phrase;

            connection.Open();
            using (reader = command.ExecuteReader())
            {
                int Col2Index = reader.GetOrdinal("col2");
                int Col3Index = reader.GetOrdinal("col3");
                int Col4Index = reader.GetOrdinal("col4");

                while (reader.Read())
                {
                    client_group_details.Add(new ClientGroupDetails(
                        reader.IsDBNull(Col2Index) ? (Nullable<DateTime>)null : (Nullable<DateTime>)reader.GetDateTime(Col2Index),
                        reader.IsDBNull(Col3Index) ? null : reader.GetString(Col3Index),
                        reader.GetInt32(Col4Index)));
                }
            }
        }
    }

    return client_group_details;
}
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何将使用公共字段的代码转换为属性?

Ree*_*sey 11

最简单的方法就是:

public DateTime Col2 { get; set; }
public String Col3 { get; set; }
public Int32 Col4 { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将使它们成为自动实现的属性而不是字段.

请注意,我不同意你的说法"公共领域永远不是一个好主意" - 我同意它们很少是一个好主意,但是(很少)它们比公共财产更好用.有关社会公共领域的一些很好的论据可能是合适的,我建议你阅读波多黎各马里亚尼的"十问价值为基础的编程",这两个问题还有答案.他为公共领域提供了强有力的理由,特别是如果没有非法的价值观,并且您希望常见用例包含频繁的变异.

话虽如此,我认为,在您的具体情况下,转换为属性将是有益的.另外,我建议将其转换为具有有意义名称的属性(不是Col2,但更像是Date等等).


编辑以回应评论:

你的全班将成为:

public class ClientGroupDetails
{
    public DateTime Col2 { get; set; }
    public String Col3 { get; set; }
    public Int32 Col4 { get; set; }

    public ClientGroupDetails(DateTime m_Col2, String m_Col3, Int32 m_Col4)
    {
        Col2 = m_Col2;
        Col3 = m_Col3;
        Col4 = m_Col4;
    }

    public ClientGroupDetails() { }
}
Run Code Online (Sandbox Code Playgroud)

但是,我建议重新设计它以获得更好的名称,即:

public class ClientGroupDetails
{
    // Not 100% sure what appropriate names should be here
    public DateTime Date { get; set; }
    public String Name { get; set; }
    public Int32 Id { get; set; }

    public ClientGroupDetails(DateTime date, String name, Int32 id)
    {
        this.Date = date;
        this.Name = name;
        this.Id = id;
    }

    // I also wouldn't include this unless you really need it...
    // public ClientGroupDetails() { }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在创建此类之后不打算编辑值,则可以通过以下方式使它们成为公开可见的属性,但不能设置:

    public DateTime Date { get; private set; }
    public String Name { get; private set; }
    public Int32 Id { get; private set; }
Run Code Online (Sandbox Code Playgroud)

这将允许您的类(即:构造函数)设置值,但是类外的任何内容都不允许更改它们.