c# - 在包装 PInvoke 东西的属性的 get 函数中放置大量代码是不好的做法吗?

标签 c# .net properties pinvoke conventions

我知道一个令人困惑的标题。让我解释一下。

我必须编码一个结构数组,然后将其转换为一个类数组(遗留兼容性)。例如

public class InnerClass {}

public class OuterClass { private InnerClass[] innerClasses; }


public struct InnerStruct {
   // Data
}

private static buildInnerClass( InnerStruct i );

public struct OuterStruct {
   private int _numInnerStructs;
   private IntPtr _innerStructs;
   // Other members

   public InnerClass[] InnerClasses {
      get {
             InnerClass[] ret = new InnerClass[_numInnerStructs];

             var structSize = Marshal.SizeOf(typeof(InnerStruct));
             var ptr = _innerStructs;

             for (int i = 0; i < _numInnerStructs; i++)
             {
                InnerStruct innerStruct = (InnerStruct)Marshal.PtrToStructure(
                                          ptr, typeof(InnerStruct));
                ret[i] = buildInnerClass(innerStruct);
                ptr = (IntPtr)((int)ptr + structSize);
             }
             return ret;
      }
   }

}

最佳答案

从真空中看,这种做法本质上没有错。但是,你应该小心......

  1. 属性 getter 应该——除了少数(如果有的话)异常(exception)——不是“昂贵的”(即,不应该消耗很多 CPU 周期或资源来执行)
  2. Property getters 应该永远不会产生副作用。例如,如果您的 PInvoke 代码获得某种新句柄,那么它应该是一个函数,而不是 getter。

一般而言,请记住属性的编写方式应使消费者没有太多(如果有的话)缓存值而不是再次调用属性的理由。如果负责任的开发商可以在您的属性(property)上遵循这种做法,那么您就走在了正确的轨道上。

关于c# - 在包装 PInvoke 东西的属性的 get 函数中放置大量代码是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223991/

相关文章:

C#/vb.net 类型不匹配通过反射查找构造函数(Integer() vs System.Int32[])

.net - 我不能再调试我的 dotnet 项目了。发生无法加载源错误

c# - 无法使用 Windows 服务从 odbc 连接(使用 dsn)打开数据库?

javascript - 如何检查对象或其子对象/子对象是否具有 Javascript 中的属性/键?

java - 如何在 Web 应用程序中读取属性文件?

c# - Entity Framework 的种子方法错误,未在代码优先模型中创建表

c# - 以 .NET 2.0 为目标时使用(某些)lambda 表达式?

C# BlockingCollection 生产者消费者不阻塞消费者线程

c# - 为什么使用 Internet SetCookie 在 Web 浏览器控件上设置 cookie 的这段代码不起作用?

swift - 创建 Swift 属性