3

显然,公共领域很少是一个好主意,并且没有添加任何属性。

例如:

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;
}
}

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

4

3 回答 3

11

最简单的方法就是这样做:

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

这将使它们自动实现属性而不是字段。

请注意,我不同意您关于“公共领域从来都不是一个好主意”的说法——我同意它们很少是一个好主意,但是(很少)有时它们比公共属性更好用。对于公共字段何时可能合适的一些很好的论点,我建议阅读 Rico Mariani 的“基于价值的编程的十个问题”,包括问题答案。他为公共字段提供了强有力的案例,尤其是在没有非法值并且您期望常见用例包括频繁突变的情况下。

话虽如此,我确实认为,在您的具体情况下,转换为属性将是有益的。此外,我建议将其转换为具有有意义名称的属性(不是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() { }
}

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

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() { }
}

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

    public DateTime Date { get; private set; }
    public String Name { get; private set; }
    public Int32 Id { get; private set; }

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

于 2012-11-02T16:07:06.750 回答
2

您可以使用私有和公共关键字来提供对这些变量的访问。完整的(非懒惰的)方式是(这里T是一些类类型)

private T myT;
public T MyT
{
    get { return this.myT; }
    set { this.myT = value; }
}

或者对于我们这些懒惰的人,你可以使用

public T MyT { get; set; }

我希望这有帮助。

于 2012-11-02T16:09:04.210 回答
1

这是属性语法的示例。在getandset块中,您现在可以像函数一样执行代码,因此您可以在将值分配给私有变量之前对其进行验证。您还可以从块中返回计算值,get而不仅仅是公开私有值。

private MyType _myField;

public MyType MyField
{
    get { return _myField; }
    set { _myField = value; }
}

如果您只是隐藏私人成员,还有速记:

public MyType MyField { get; set; }
于 2012-11-02T16:06:29.400 回答