不了解C#中的对象实例化

4 c# instantiation

这篇文章对我对C#类的理解以及为什么它们比静态函数更有优势.

我想获得一个对象列表.列表中的每个对象代表表中的记录.这在静态函数中很容易做到.

使用课程,我已经能够按如下方式进行:

调用例程:

ListOfBusinesses l = new ListOfBusinesses ();
List<Business> b = l.listBusinesses();
Run Code Online (Sandbox Code Playgroud)

课程:

 public class Business
 {
    public string Bupk { get; set; }
    public string Bu_name { get; set; }

 }  

 public class ListOfBusinesses
 {
    public List<Business> listBusinesses()
    {

      List<Business> businesses = new List<Business>();
      businesses.Add(new Business("1", "Business Name 1"));
      businesses.Add(new Business("2", "Business Name 2"));

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

我不能重写这个类,这样就可以用一行来完成:

ListOfBusinesses l = new ListOfBusinesses();
Run Code Online (Sandbox Code Playgroud)

在我看来,上面的ListofBusinesses类只不过是一个包含在没有属性的类中的静态函数,只是为了拥有一个类.

我试过了:

public class ListOfBusinesses
{
    List<Business> businesses;

    public List<Business> ListOfBusinesses()
    {

      List<Business> businesses = new List<Business>();
      businesses.Add(new Business("1", "Business Name 1"));
      businesses.Add(new Business("2", "Business Name 2"));

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

但收到编译器错误"成员名称不能与封闭类型相同".例如,我试图使用构造函数,但我遗漏了一些东西.

在我误解了一段时间的地方,任何帮助都会启发我.

迈克托马斯

lc.*_*lc. 9

我认为你混淆了静态函数,构造函数和工厂方法的概念.

静态功能

定义

这是一种无法访问(并且与之无关)this类实例的方法.

例

public class BusinessHelper
{   
    public static List<Business> ListBusinesses()
    {

        List<Business> businesses = new List<Business>();
        businesses.Add(new Business("1", "Business Name 1"));
        businesses.Add(new Business("2", "Business Name 2"));

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

用法

使用类名称调用静态方法,而不是类的实例.

List<Business> businesses = BusinessHelper.ListBusinesses();
Run Code Online (Sandbox Code Playgroud)

构造函数:这是一个创建this类实例的方法.它没有返回值,并在实例化对象时调用.

例

public class BusinessList
{   
    public List<Business> TheList;

    public BusinessList()
    {    
        TheList = new List<Business>();
        TheList.Add(new Business("1", "Business Name 1"));
        TheList.Add(new Business("2", "Business Name 2"));   
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

创建对象的新实例.

BusinessList myBusinessList = new BusinessList();
businesses = myBusinessList.TheList;
Run Code Online (Sandbox Code Playgroud)

工厂方法

定义

这是一个创建对象实例的方法,以某种方式实例化它,并返回对它的引用.

例

public class BusinessList
{   
    public List<Business> TheList;

    public static BusinessList BusinessListWithTwoCompanies()
    {
        BusinessList instance = new BusinessList();

        businesses = new List<Business>();
        businesses.Add(new Business("1", "Business Name 1"));
        businesses.Add(new Business("2", "Business Name 2"));

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

用法

调用工厂方法而不是创建新对象.

BusinessList myBusinessList = BusinessList.BusinessListWithTwoCompanies();
businesses = myBusinessList.TheList;
Run Code Online (Sandbox Code Playgroud)

另外要注意两件事:

  1. 声明一个businesses领域,而是继续以实例另一个称为变量businesses在你的ListOfBusinesses()方法,并将其返回.这个businesses领域什么都不会发生.小心变量范围.

  2. 您不能拥有与该类同名的成员(字段,属性或方法).这是为构造函数保留的,它没有返回类型(参见上文).这就是您收到编译器错误的原因.


Sam*_*war 5

当然.而不是封装List<Business>,扩展它.然后你只需要在构造函数中添加它.

public class ListOfBusinesses : List<Business> {
    public ListOfBusinesses() : base() {
        Add(new Business("1", "Business Name 1"));
        Add(new Business("2", "Business Name 2"));
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它:

List<Business> l = new ListOfBusinesses();
Run Code Online (Sandbox Code Playgroud)


Gre*_*egC 1

您正在寻找工厂方法而不是构造函数。