Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分配给IList<&燃气轮机;或列表<>;?_C# - Fatal编程技术网

C# 分配给IList<&燃气轮机;或列表<>;?

C# 分配给IList<&燃气轮机;或列表<>;?,c#,C#,可能重复: 我有以下资料: public class CityViewModel { public CityViewModel() { Details = Enumerable.Range(1,10).Select(x => new City.Detail()).ToList(); } public string Topic { get; set; } public City City { get; set; } pub

可能重复:

我有以下资料:

public class CityViewModel
{
    public CityViewModel() {     
        Details = Enumerable.Range(1,10).Select(x => new City.Detail()).ToList(); 
    }
    public string Topic { get; set; }
    public City City { get; set; }
    public IList<City.Detail> Details { get; set; }
}
公共类城市视图模型
{
公共城市视图模型(){
Details=Enumerable.Range(1,10)。选择(x=>newcity.Detail()).ToList();
}
公共字符串主题{get;set;}
公共城市城市{get;set;}
公共IList详细信息{get;set;}
}
这个建议是给我的,作为创造细节的一种方式。我不确定的是,为什么将以下行声明为IList:

public IList<City.Detail> Details { get; set; }
public IList详细信息{get;set;}
将其声明为:

public List<City.Detail> Details { get; set; }
公共列表详细信息{get;set;}

有人能给我解释一下区别吗。

我的观点是,返回IList使方法的调用方不知道底层实现。这意味着,如果将方法内部的实现更改为另一个也实现了IList的集合,则不必更新任何调用方。然而,如果您返回一个具体的列表,那么如果您对基础集合类型进行更改,则必须更新所有调用方。

我的观点是,返回IList使方法的调用方不知道基础实现。这意味着,如果将方法内部的实现更改为另一个也实现了IList的集合,则不必更新任何调用方。然而,如果您返回一个具体的列表,那么如果您更改基础集合类型,则必须更新所有调用方。

IList
是一个接口<代码>列表是一种具体类型

如果你想少告诉用户你的内部实现(通常这是你想要避免的),那么你应该使用
IList
——因为你可以自由地切换到实现该接口的任何东西。。。它可能是某种适配器或包装器,也可能是用于测试的模拟

我也会考虑你是否真的需要返回一个列表样式对象,或者使用<代码> iQueLabe可以更好地满足你的需求(如果你只是重复这个列表)。我认为,只有在需要长度和直接索引的情况下,才需要列表,即使这样,从

IEnumerable
创建列表也很容易。

IList
是一个界面<代码>列表是一种具体类型

如果你想少告诉用户你的内部实现(通常这是你想要避免的),那么你应该使用
IList
——因为你可以自由地切换到实现该接口的任何东西。。。它可能是某种适配器或包装器,也可能是用于测试的模拟


我也会考虑你是否真的需要返回一个列表样式对象,或者使用<代码> iQueLabe可以更好地满足你的需求(如果你只是重复这个列表)。如果您需要长度和直接索引,我认为您只需要列表-即使这样,从

IEnumerable
创建列表也很容易。

使用接口而不是类绝对是正确的方法,无论是出于信息隐藏还是可测试性的原因。如果可以的话,我甚至会更进一步,建议使用
ICollection
而不是
IList
:这将使您在选择替代实现时更加灵活,同时让您的用户执行大致相同的操作

此外,我可能不会为它使用自动可分配属性:我将返回一个只读版本,并在我自己的类上提供单独的方法来操作列表

下面是我要做的:

public class CityViewModel {
    private readonly List<City.Detail> details;
    public CityViewModel() {
        // Here you assign a List to details
    }
    public ICollection<City.Detail> Details {
        get {
            return details.AsReadOnly();
        }
    }
}
公共类城市视图模型{
私人只读列表详细信息;
公共城市视图模型(){
//在这里,您可以为详细信息分配一个列表
}
公共ICollection详细信息{
得到{
返回详细信息。AsReadOnly();
}
}
}

这对用户隐藏了列表的实现,不允许他们在背后修改列表,甚至不告诉他们您正在使用
列表
。如果您决定在以后的某个日期使用(比如)一个
哈希集
,您就可以将它替换进来,而不用担心破坏使用类的代码中的某些内容。

出于信息隐藏和可测试性的原因,使用接口而不是类绝对是正确的选择。如果可以的话,我甚至会更进一步,建议使用
ICollection
而不是
IList
:这将使您在选择替代实现时更加灵活,同时让您的用户执行大致相同的操作

 public IEnumerable<City.Detail> Details { get; private set; }
此外,我可能不会为它使用自动可分配属性:我将返回一个只读版本,并在我自己的类上提供单独的方法来操作列表

下面是我要做的:

public class CityViewModel {
    private readonly List<City.Detail> details;
    public CityViewModel() {
        // Here you assign a List to details
    }
    public ICollection<City.Detail> Details {
        get {
            return details.AsReadOnly();
        }
    }
}
公共类城市视图模型{
私人只读列表详细信息;
公共城市视图模型(){
//在这里,您可以为详细信息分配一个列表
}
公共ICollection详细信息{
得到{
返回详细信息。AsReadOnly();
}
}
}
这对用户隐藏了列表的实现,不允许他们在背后修改列表,甚至不告诉他们您正在使用
列表
。如果您决定在以后的某个日期使用一个
HashSet
,您就可以将其替换,而不用担心破坏使用类的代码中的某些内容。

public IEnumerable Details{get;private set;}
 public IEnumerable<City.Detail> Details { get; private set; }
这可能是您想要作为类的接口开始的地方。公开最低限度的必要功能,不允许外部类修改成员或集合

仅在需要时公开附加功能(IList),并且仅在绝对需要时公开setter。

public IEnumerable Details{get;private set;}
T