Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 在.NET中,何时调用getter和setter?_C#_.net - Fatal编程技术网

C# 在.NET中,何时调用getter和setter?

C# 在.NET中,何时调用getter和setter?,c#,.net,C#,.net,我有一个button对象,它使用这个模型类 public class ButtonModel { public string Name {get; set;} public Image Icon {get; set} public Color BackgroundColor {get; set;} public ButtonModel(string name, Color color) { Name = name; Icon =

我有一个button对象,它使用这个模型类

public class ButtonModel {
    public string Name {get; set;}
    public Image Icon {get; set}
    public Color BackgroundColor {get; set;}

    public ButtonModel(string name, Color color) {
        Name = name;
        Icon = Image.FromFile(AssetsFolder + "/" + Name);
        BackgroundColor = color;
    }
}

我一开始就加载了所有的ButtonModel,但我认为这可能会影响性能。上述课程与本课程之间是否存在显著差异:

public class ButtonModel {
   public string Name {get; set;}
   public Color BackgroundColor {get; set;}
   public Image Icon {get { return Image.FromFile(AssetsFolder + "/" + Name); }}
}
更具体地说,是在类首次初始化时调用Icon的getter,还是在使用Icon属性本身时调用它?根据之前与getter的经验,第二种说法似乎更正确。此外,Icon属性中的图像(假定其未在其他地方使用)是否会保留在内存中,还是每次调用该属性时都会重新重置

第一次初始化类时是调用Icon的getter,还是在使用Icon属性本身时调用它?根据之前与getter的经验,第二种说法似乎更正确

每次其他代码在需要属性值的表达式中使用属性名时,都会调用getter。即第二项声明

此外,Icon属性中的图像(假定其未在其他地方使用)是否会保留在内存中,还是每次调用该属性时都会重新重置

这取决于图像是什么。但假设您讨论的是System.Drawing.Image,它不会进行任何内部全局缓存。每次调用FromFile时,它都会读取该文件并创建一个新的对象实例

所以,不……您可能不想使用您提供的第二个代码示例,因为每次使用属性时都必须重新创建图像对象

也就是说,在某些情况下,您可能会发现该类很有用。例如:

private readonly Lazy _icon=new Lazy=>Image.FromFileAssetsFolder+/+Name; 公共图像图标=>\u Icon.Value; 这是否有用取决于在程序启动时总是立即使用属性值,还是仅在以后检索属性值。如果总是立即使用属性值,那么您就不太可能看到使用Lazy-it的任何优势,事实上甚至可能更慢。但是对于一个只在某些时候使用的属性,让用户在将要使用它的那一刻等待初始化是可以接受的,Lazy类可以为您提供该功能

旁白:我一直疏忽地没有提到与此相关的问题。具体来说,您发布的代码没有显示任何正确处理创建的图像对象的机制。这是另一个需要讨论的话题,完全有可能您的代码示例因为这个问题而被简化了。但是请确保您确实了解了处理实现IDisposable的对象的需求

第一次初始化类时是调用Icon的getter,还是在使用Icon属性本身时调用它?根据之前与getter的经验,第二种说法似乎更正确

每次其他代码在需要属性值的表达式中使用属性名时,都会调用getter。即第二项声明

此外,Icon属性中的图像(假定其未在其他地方使用)是否会保留在内存中,还是每次调用该属性时都会重新重置

这取决于图像是什么。但假设您讨论的是System.Drawing.Image,它不会进行任何内部全局缓存。每次调用FromFile时,它都会读取该文件并创建一个新的对象实例

所以,不……您可能不想使用您提供的第二个代码示例,因为每次使用属性时都必须重新创建图像对象

也就是说,在某些情况下,您可能会发现该类很有用。例如:

private readonly Lazy _icon=new Lazy=>Image.FromFileAssetsFolder+/+Name; 公共图像图标=>\u Icon.Value; 这是否有用取决于在程序启动时总是立即使用属性值,还是仅在以后检索属性值。如果总是立即使用属性值,那么您就不太可能看到使用Lazy-it的任何优势,事实上甚至可能更慢。但是对于一个只在某些时候使用的属性,让用户在将要使用它的那一刻等待初始化是可以接受的,Lazy类可以为您提供该功能


旁白:我一直疏忽地没有提到与此相关的问题。具体来说,您发布的代码没有显示任何正确处理创建的图像对象的机制。这是另一个需要讨论的话题,完全有可能您的代码示例因为这个问题而被简化了。但是请确保您确实了解了处理实现IDisposable的对象的要求。

第一个类声明有一个bug,它忘记了实现IDisposable。第二类不能这样做,处理图像是其他人的工作。没有任何线索
他们每次使用该物业时都需要提供的服务。是的,差别很大。GC在使用托管对象之后不会收集它们吗?启动后我没有看到内存使用量增加。GC在使用托管对象后不会收集它们吗?-如果对象最终无法访问,GC可能会收集该对象。图像类对象具有终结器,它将在收集对象之前处理对象,但这是一个后盾,不是好的代码所依赖的。当不再需要某个对象时,应始终确保该对象已被处置。当然,在第一个示例中,可能永远不会丢弃模型对象本身,因此也永远不需要处理图标值。没有足够的上下文来确定。感谢您的快速响应,ButtonModel现在充当了一个助手类,用于在桌面应用程序中填充大量图像。我问这个问题的原因是,许多按钮不是在启动时直接加载的,而是在构建其他WPF用户控件时加载的。在这种情况下,从磁盘读取的轻微性能损失不是比将对象保留在内存中更好吗?编辑:我已经从上面查看了IDisposable bug。立即处置确实将堆从100MB空闲减少了20MB。GC现在在大量使用期间大约从180MB开始,峰值为240MB,然后变为空闲。从磁盘读取的轻微性能损失不是比将对象保留在内存中更好吗这将取决于许多因素,包括有多少RAM和交换文件空间可供您使用,您的磁盘有多快,文件有多大,等等。除了立即初始化和延迟初始化之外,我的答案中的示例完全排除了丢弃单个图像的可能性…整个模型对象必须被释放,还有缓存,它可以通过弱引用实现,也可以不通过弱引用实现。内存管理是一个非常广泛的话题。第一个类声明有一个bug,它忘记了实现IDisposable。第二类不能这样做,处理图像是其他人的工作。没有任何提示,他们需要每次使用该属性。是的,差别很大。GC在使用托管对象之后不会收集它们吗?启动后我没有看到内存使用量增加。GC在使用托管对象后不会收集它们吗?-如果对象最终无法访问,GC可能会收集该对象。图像类对象具有终结器,它将在收集对象之前处理对象,但这是一个后盾,不是好的代码所依赖的。当不再需要某个对象时,应始终确保该对象已被处置。当然,在第一个示例中,可能永远不会丢弃模型对象本身,因此也永远不需要处理图标值。没有足够的上下文来确定。感谢您的快速响应,ButtonModel现在充当了一个助手类,用于在桌面应用程序中填充大量图像。我问这个问题的原因是,许多按钮不是在启动时直接加载的,而是在构建其他WPF用户控件时加载的。在这种情况下,从磁盘读取的轻微性能损失不是比将对象保留在内存中更好吗?编辑:我已经从上面查看了IDisposable bug。立即处置确实将堆从100MB空闲减少了20MB。GC现在在大量使用期间大约从180MB开始,峰值为240MB,然后变为空闲。从磁盘读取的轻微性能损失不是比将对象保留在内存中更好吗这将取决于许多因素,包括有多少RAM和交换文件空间可供您使用,您的磁盘有多快,文件有多大,等等。除了立即初始化和延迟初始化之外,我的答案中的示例完全排除了丢弃单个图像的可能性…整个模型对象必须被释放,还有缓存,它可以通过弱引用实现,也可以不通过弱引用实现。内存管理是一个非常广泛的话题。