在C#中将实例定义为动态意味着:
编译器不执行编译时类型检查,但运行时检查就像它对所有实例一样.
编译器不执行编译时类型检查,但运行时检查发生,与任何其他非动态实例不同.
与2相同,这会带来性能损失(微不足道的?潜在的重要性?).
我们正在寻找应用程序中的一些内存泄漏,在进行一些操作(在我们的应用程序中加载和关闭一个项目)时,我们知道内存总是增加一点点.
我们已经找到了很多它们,但是现在,10个以上增加最多的类是(根据我们的工具,ANTS Memory Profiler 8.2):
不幸的是,我不知道这是什么,所以我有点难以找到我应该释放的内容.
我检查了实例树但是,它一直用微软的东西.
问题在于,当我们对项目进行"打开/关闭"时,我们会经历很多(大部分)代码.
编辑我们的应用程序的一部分使用dynamic关键字作为某些资源,它可能是链接的.这里的课程不是Disposable,我应该和他们做些什么吗?
编辑2
我很确定这与我的dynamic东西有关,似乎C#在使用动态时创建了一个缓存.但是目前我不知道它为什么会增长(我一直加载相同的类,我将始终拥有完全相同的签名),也不知道如何清除它.
我正在使用ANTLR构建一个简单的.NET for .NET,将字符串中的脚本转换为Dynamic Method.我的第一个想法是转换为IL操作码,但现在我正在阅读有关DM创建的表达式树.似乎我可以使用表达式树生成任何方法,就像IL代码一样?
谢谢!
我正在使用EmguCV 3.0.0包装器来访问OpenCV 3.0库.我Mat在几个地方使用这门课.以下是单个通道的示例,8x8图像由double值组成:
Mat image = new Mat(8, 8, DepthType.Cv64F, 1);
Run Code Online (Sandbox Code Playgroud)
的Image<>类提供用于获取和设置的像素值合理的手段,并且该方法是对相同的Matrix<>类,但是它似乎没有那么明显的Mat类.我弄清楚如何设置单个像素的唯一方法是使用掩码:
// set two pixel values, (0,0) to 9.0, (2, 3) to 42.0
Matrix<byte> mask = new Matrix<byte>(8,8);
mask.Data[0, 0] = 1;
image.SetTo(new MCvScalar(9.0), mask);
mask = new Matrix<byte>(8,8);
mask.Data[2, 3] = 1;
image.SetTo(new MCvScalar(42.0), mask);
Run Code Online (Sandbox Code Playgroud)
这感觉它应该是两行,而不是六行,所以我觉得我错过了一些东西.当Mat多个通道时,事情变得更加复杂,因为Matrix<>只有2D,因此必须使用掩模来设置每个通道上的像素.
我无法承受以这种方式设置像素的时间或内存. 如何通过单个方法调用设置像素?
所以明显的方法是......
var handler = GetType().GetMethod(methodName, BindingFlags.NonPublic |
BindingFlags.Instance);
handler.Invoke(this, new object[] {e});
Run Code Online (Sandbox Code Playgroud)
我可以添加缓存以保持方法,但我想知道是否有一个完全不同和更快的方式?
I've seen similar questions/answers for this posted in the past, but mine differs slightly from the others that I've seen.
Essentially, I have a common interface and several classes that implement/inherit from it. Then, in a separate class, I have methods that must act upon objects given by the interface IObject. However, each of them must be acted upon in different ways, hence why there is a separate declaration of the method for each concrete type that extends IObject.
class …Run Code Online (Sandbox Code Playgroud) dynamic是隐式还是显式类型分配?如何在运行时在以下示例的上下文中为动态变量进行内存分配.
由于C#是类型安全的语言,因此对类型安全的影响.
public class Program
{
static void Main(string[] args)
{
dynamic dynamicVar = 10;
dynamicVar = true;
dynamicVar = "hello world";
// compiles fine
int index = dynamicVar.IndexOf("world");
}
}
Run Code Online (Sandbox Code Playgroud) 我这里有一个奇怪的问题.我有一个项目的约束,其中一个属性的值必须要么是一个数字(int,double,long,等都是可以接受的),一个string或datetime.Value参数需要是这三个中的一个(错误..如果计算所有可能的数值类型允许它更多一些)类型是因为取决于类型,底层值将需要转换为用于序列化到REST API的特殊格式.为了简化这里的事情,这个课程的基本概念是POCO:
class Foo
{
public string Name {get;set;}
public Guid Id {get; set;}
public UNKNOWN Value {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我考虑过使用泛型,有一个where T : struct约束,但是这仍然留下太多的理论上可以设置的类型,实际上是无效的类型.当然,我可以在构造/设置Value参数期间执行类型检查和抛出异常,但这不像"干净"代码.
我看了一下这个问题你如何使用一个可以是多种类型的变量?但它并没有真正帮助,因为它更多的是处理继承的问题.但是,使用多个可空的私有字段并根据填充的单个属性返回单个属性是可能的,但我觉得必须有更好的方法.
我想到的另一种可能性是使用dynamic类型并执行一些反射魔术来检查基础类型(并执行转换和格式化/抛出异常).我有点害怕这会伤害到性能.
这种情况有什么最佳做法吗?如果没有,有没有比我提到的更好的方法来解决这个问题?
我正在写一种特殊的System.IO.BinaryWriter. 这位作者应该能够处理整数类型,包括Enum,以及这些类型的集合。
abstract class MyBinaryWriter
{
// ...
#region Methods: Basic Types: Writing
public abstract void Write(byte value);
public abstract void Write(ushort value);
public abstract void Write(uint value);
public abstract void Write(ulong value);
public abstract void Write(string value);
#endregion
#region Methods: Complex Types: Writing
public virtual void Write<T>(ICollection<T> collection)
{
// first write the 32-bit-unsigned-length prefix
if (collection == null || collection.Count == 0)
{
Write((uint)0);
}
else
{
Write((uint)collection.Count);
// then write the …Run Code Online (Sandbox Code Playgroud) 所以我对C#很新,我一直在学习将我的代码从python转换为C#.现在我偶然发现的问题是:我如何捕获CS7036错误.它在python中被称为"AttributeError",如果你试图实例化一个类而没有所需数量的参数,它就会发生.
public Vector Crossproduct(Vector other)
{
try
{
List<double> output = new List<double>()
{
Y* other.Z - other.Y * Z,0 - (X * other.Z- other.X * Z),X* other.Y - other.X * Y
};
Vector outputvector = new Vector(output);
return outputvector;
}
catch (Exception)
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了这一点,发现此错误几乎没有任何内容.这是Microsoft的C#文档的链接.这里和这里.
我的问题不是如何修复错误,而是如何捕获它,只是让我很清楚.
如果使用动态关键字&我们分配一些类型,编译器执行装箱/解拳操作?例如;
dynamic myInstance=null;
object key="BankProject.Payment";
Type myType=ServiceCashe.GetType(key);//get desire type from cache...
myInstance=Activator.CreateInstance(myType); //instanciate myType
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×2
dynamic ×2
generics ×2
performance ×2
.net-3.5 ×1
antlr ×1
c#-4.0 ×1
collections ×1
dsl ×1
emgucv ×1
il ×1
javascript ×1
mat ×1
memory-leaks ×1
overflow ×1
profiler ×1
types ×1
value-type ×1