小编Hom*_*mde的帖子

深度检查,是否有更好的方法?

注意:这个问题是在引进之前要求.?在C#6/Visual Studio的2015年运营商.

我们都去过那里,我们有像cake.frosting.berries.loader这样的深层属性,我们需要检查它是否为空,所以没有例外.要做的是使用短路if语句

if (cake != null && cake.frosting != null && cake.frosting.berries != null) ...
Run Code Online (Sandbox Code Playgroud)

这不是很优雅,也许应该有一种更简单的方法来检查整个链,看看它是否出现了null变量/属性.

是否可以使用某种扩展方法或者它是一种语言功能,还是只是一个坏主意?

c# null

128
推荐指数
6
解决办法
2万
查看次数

延迟调度调用?

在WPF中,由于接口更新的复杂性,我有时必须在短暂的延迟后执行操作.

目前我这样做只是通过:

        var dt = new DispatcherTimer(DispatcherPriority.Send);
        dt.Tick += (s, e) =>
        {
            dt.Stop();
            //DoStuff
        };
        dt.Interval = TimeSpan.FromMilliseconds(200);
        dt.Start();
Run Code Online (Sandbox Code Playgroud)

但是每次创建一个新的计时器都有点丑陋和开销可能太多(?)从性能的角度来看,最好的做法是什么,即最快地执行?有什么好的方法可以将上面的代码改写成:

        this.Dispatcher.BeginInvoke(new Action(delegate()
        {
            //DoStuff
        }), DispatcherPriority.Send,TimeSpan.FromMilliseconds(200));
Run Code Online (Sandbox Code Playgroud)

Timespan是延迟的地方,感谢任何输入:)

.net wpf dispatcher

16
推荐指数
2
解决办法
8634
查看次数

获得多个FileInfo的更快捷方式?

这是一个远景,但是有更快的方法来获取多个文件的大小,lastaccessedtime,lastcreated time等?

我有很长的文件路径列表(所以我不需要枚举)并且需要尽快查找该信息.并行创建FileInfo可能无济于事,因为瓶颈应该是磁盘.

NTFS Journal只会遗留文件名,否则"很棒",我猜操作系统不会在某个地方存储这些元信息?

如果存在静态或Win32调用(文件方法只允许我一次获取一条信息)方法,可以执行另一个优化,该方法获取信息而不是创建一堆FileInfo对象

无论如何,很高兴,如果有人知道可能有帮助的东西,不幸的是我必须在这里进行微优化,没有"使用数据库"不是一个可行的答案;)

c# file-io winapi

13
推荐指数
2
解决办法
4580
查看次数

String.comparison性能(带修剪)

我需要做很多高性能的不区分大小写的字符串比较,并意识到我这样做.ToLower().Trim()真的很愚蠢,因为所有的新字符串都被分配了

所以我挖了一点,这种方式似乎更可取:

String.Compare(txt1,txt2, StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是我想忽略前导或尾随空格,即Trim(),但如果我使用Trim,我对字符串分配也有同样的问题.我想我可以检查每个字符串,看看它是StartsWith("")还是EndsWith("")然后才修剪.要么指出索引,要么计算每个字符串的长度并传递给string.Compare覆盖

public static int Compare
(
    string strA,
    int indexA,
    string strB,
    int indexB,
    int length,
    StringComparison comparisonType
) 
Run Code Online (Sandbox Code Playgroud)

但是这看起来相当混乱我可能不得不使用一些整数,如果我没有为两个字符串上的尾随和前导空白的每个组合制作一个非常大的if-else语句...那么优雅解决方案的任何想法?

这是我目前的提议:

public bool IsEqual(string a, string b)
    {
        return (string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0);
    }

    public bool IsTrimEqual(string a, string b)
    {
        if (Math.Abs(a.Length- b.Length) > 2 ) // if length differs by more than 2, cant be equal
        {
            return  false;
        }
        else if (IsEqual(a,b))
        {
            return true;
        }
        else 
        {
            return (string.Compare(a.Trim(), b.Trim(), StringComparison.OrdinalIgnoreCase) …
Run Code Online (Sandbox Code Playgroud)

c# string string-comparison

10
推荐指数
1
解决办法
9319
查看次数

通过IList后门通用列表

我有一个场景,其中一个类加载一种类型的对象,由于抽象我不能使用泛型类(泛型往往像癌症一样蔓延:)但我经常想要检索一次通用版本的对象,结果在像这样的代码(简化):

List<SomeClass> items = Storage.LoadItems(filename).OfType<SomeClass>().ToList();
Run Code Online (Sandbox Code Playgroud)

在LoadItems返回List <object>的地方,我意识到,为什么不这样做呢

public void LoadItems(string filename,IList list);
Run Code Online (Sandbox Code Playgroud)

现在我可以这样做

List<SomeClass> items = new  List<SomeClass>();
LoadItems(filename,items);
Run Code Online (Sandbox Code Playgroud)

哪个应该更有效率.由于我可以使用现有的List并添加新项目,因此它似乎也更灵活一些.所以我的问题是,这是一种常见的模式还是你有不同/更好的方法来实现这一目标?

我也有点好奇你可以做到这一点,如果你尝试添加一个错误类型的对象你得到一个例外,但这是否意味着通用列表也进行类型检查?(这似乎有点不必要)

编辑 修改模式实际上可能更优雅一些

public IList LoadItems(string filename,IList list=null);
Run Code Online (Sandbox Code Playgroud)

这样你可以流利地使用语句,如果没有传递列表,你可以简单地实例化List <object>

c# generics ilist

8
推荐指数
1
解决办法
339
查看次数

在appdomain中移动数据并获得良好的性能?

一点背景

我正在研究一个大量使用插件的.net应用程序,应用程序可以从插件中请求数据,然后由应用程序发回并显示.

首先我在MEF中实现了插件框架,但觉得它有点受限于我的目的,我希望能够隔离插件并具有一些版本控制和许可支持(因为插件可以由第三方编写).

然后开始看MAF,它似乎只支持那些场景,但是我可以看到一件可能有问题的事情,在我投入太多时间将所有内容改为MAF之前,如果有人有这个问题的经验,那将是很好的,因为我没有工作很多MAF.

问题

目前,当数据被发送回应用程序时,您将获得数据的实际对象以及说明对象包含哪些字段的适配器,您可以使用对象上的适配器来提取所需的字段.这样做的好处是您不必生成任何新的结果对象,但只需在每个对象需要时查询结果数据.

现在使用MAF存在Appdomain问题,我无法自由发送应用程序域中的所有对象,并且从每个对象的marshalbyref继承是不可行的.

我可以使用每个对象的字符串字段生成结果对象,但从性能的角度来看,它似乎不是一个好主意,界面可能只显示数百个对象中的10个,因此按需执行似乎更聪明.

我正在考虑的解决方案可能是生成一系列正对象ID,并让接口通过代理从appdomain中获取插件中的字段.所以应用程序说例如它需要插件中的项[y]的fieldname x,并且这些字符串是通过appdomain发送的.

问题

所以我的问题是,这是一个很好的方法吗,有更好的方法吗?我显然会在appdomain上移动一点性能,但由于它是按需的,只有少量的对象,它不应该太糟糕了吗?我该如何设置这样的代理对象?

抱歉,这不是世界上最容易回答的问题.我真的很感激任何见解,插件架构的未来取决于它:)

.net plugins add-in mef appdomain

6
推荐指数
1
解决办法
926
查看次数

更改RX运营商的间隔?

这可能是一个愚蠢的问题,因为我对RX有点新:)

我正在抽样一个事件(RX为.Net 4.0):

eventAsObservable.Sample(TimeSpan.FromSeconds(1)).Timestamp().Subscribe(x => Console.WriteLine("testing:"+ x.Value.EventArgs.str));

问题是采样时间需要能够动态改变,我想我可以制作一些属性来移除现有的处理程序,并在它发生变化时创建一个新的处理程序,但它看起来有点乱,更容易受到计时问题的影响.有没有办法简单地改变间隔?

示例:假设某人正在编写一串字符,当检测到某个序列时,您希望更改采样时间而不会错过任何事件,并且最好不要多次获取事件

.net system.reactive

6
推荐指数
2
解决办法
1463
查看次数

[Serializable]是否适用于继承的类?

我没有使用远程工作,所以请原谅这个相当基本的问题,如果我从一个标记为[Serializable]的抽象类派生一个类(用于在appdomain中传递数据),另一方是否得到了实际的覆盖实现?即多态性是否适用于远程处理/可序列化?

我需要在另一边创建一个克隆而不是在原始文件上操作,所以MarshalByRef不是一个选项......

.net c# serialization appdomain

6
推荐指数
1
解决办法
3928
查看次数

协变对象初始化器?

假设我有一个具有字典<string,bool>属性的类,使用对象初始化程序我可以使用这种语法(我觉得看起来很干净):

new MyClass()
{
  Table = { {"test",true},{"test",false} }
}
Run Code Online (Sandbox Code Playgroud)

但是,在初始化程序之外我不能这样做:

this.Table = { {"test",true},{"test",false} };
Run Code Online (Sandbox Code Playgroud)

为什么初始化器是特例?我猜测它与LINQ要求,协方差或诸如此类的东西有关,但感觉有点不一致,无法在任何地方使用这种初始化器...

.net c# object-initializers

6
推荐指数
2
解决办法
586
查看次数

调用方法的条件返回方法呢?

好吧,这可能是一些黑客攻击,但请忍受我:)背景是我厌倦了一些方法,那些if语句会弄乱整个方法,例如:

public SomeClass DoStuff(string inputStr)
{
  SomeClass result =null;
  if (IsOpenFilter(inputStr))
  {
    ....
  }

  return result;
}
Run Code Online (Sandbox Code Playgroud)

所以我在想,如果我可以做这样的事情,那不是很好吗:

public SomeClass DoStuff(string inputStr)
{
  Require(IsOpenFilter(inputStr),null);


  ....

  return result;
}
Run Code Online (Sandbox Code Playgroud)

这种情况可能会被某种形式的代码合同所涵盖,如果是这样,请纠正我:)

我们的想法是,如果语句的计算结果为true,则返回null.如果该方法没有返回类型,则只需:Require(IsOpenFilter(inputStr));

所以我想有两个问题,这可以以某种方式完成吗?我对如何通过调用方法进行条件返回感到困惑.

另一个问题是,这是一个好主意吗?monkeypatch这样的语言有点奇怪,但我更喜欢代码读取的方式.如果它可以放在方法上面的属性中,我会更干净:[Require(IsOpenFilter(inputStr))]

c# code-contracts

5
推荐指数
1
解决办法
2843
查看次数