小编B3r*_*ret的帖子

为什么这不起作用?(通用等于助手)

解决了! 这个工作,我需要告诉编译器T当然实现IEquatable ...

public static bool secureEquals<T>(T obj1, object obj2)
    where T: class, IEquatable<T>
{...

public static bool secureEquals<T>(T obj1, T obj2)
    where T: class, IEquatable<T>
{....
Run Code Online (Sandbox Code Playgroud)

题:

我试图将IEquatable实现和Equals覆盖的重复功能放入一个单独的静态类中,如下所示:

public static class EqualsHelper
{
    public static bool secureEquals<T>(T obj1, object obj2)
       where T : class
    {
        if (obj2 is T)
        {
            return secureEquals(obj1, obj2 as T);
        }
        else
        {
            return false;
        }
    }

    public static bool secureEquals<T>(T obj1, T obj2)
    {
        if (obj1 == null)
        {
            if (obj2 != null) …
Run Code Online (Sandbox Code Playgroud)

c# generics equals

3
推荐指数
1
解决办法
384
查看次数

如果对象是垃圾回收,如何获得通知?

精简版:

对于缓存类,如果对象被垃圾收集(从我的缓存中删除相应的条目),我需要得到通知.这样做的最佳方法是什么?从析构函数发送事件?

长版:

我正在编写一个cacher/memoizer,用于获取一个巨大的参数树对象和许多小值类型参数的函数,例如,

double myFunc(HugeParTree parTree, int dynPar1, double dynPar2)
Run Code Online (Sandbox Code Playgroud)

我想以下列方式缓存这些函数:

  • 缓存元组的结果(parTree.GUID,dynPar1,dynPar2,...)
  • 每当parTree很少发生变化时,所有相应的缓存条目都将被删除(通过Observer模式).(parTree.Equals()太贵了;它比较了100多种价值类型).

代码现在看起来像这样(对于一个值参数):

public class CachedFunction1ObsPar1Par<TRet, TObsPar1, TPar1>
        where TObsPar1 : IObservable, IProvideGUID
    {
        public delegate TRet ValueCalculator(TObsPar1 obsPar1, TPar1 par1);

        public CachedFunction1ObsPar1Par(ValueCalculator calc)
        {
            _calc = calc;
        }


        #region members

        private ValueCalculator _calc;

        private Dictionary<Guid, Dictionary<TPar1, TRet>> _cache = 
            new Dictionary<Guid, Dictionary<TPar1,TRet>>();

        #endregion


        public TRet value(TObsPar1 obsPar1, TPar1 par1)
        {
            TRet result;
            bool cacheHit = checkCache(obsPar1, par1, out result);

            if (cacheHit)
            {
                Debug.Assert(result.Equals(_calc(obsPar1, …
Run Code Online (Sandbox Code Playgroud)

.net c# caching garbage-collection observer-pattern

2
推荐指数
1
解决办法
1331
查看次数

C#是否为未使用的模板参数生成具体实现?

如果我有

abstract class Base<TSub>
{
    protected static List<TSub> MyStaticList;
}

class DerivedA : Base<DerivedA>
{
}

class DerivedB : Base<DerivedB>
{

}
Run Code Online (Sandbox Code Playgroud)

我得到两个独立的MyStaticList变量,每个基类一个.如果相反,基地看起来像这样

class Base<TSub>
{
    protected static List<string> MyStaticList;
}
Run Code Online (Sandbox Code Playgroud)

即,模板参数没有使用,我保证仍然得到两个独立的MyStaticList变量?

(我需要这个用于availableValues()自定义类Enum类层次结构的方法.)

c# generics inheritance static

2
推荐指数
1
解决办法
156
查看次数