小编Ale*_*nko的帖子

收集初始化器的奇怪语法

假设,我们有一个非常简单的类:

class ObjectList {
    public List<string> List1 { get; } = new List<string>();
    public List<string> List2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我们想要创建这个类的实例:

ObjectList objectList = new ObjectList {
    List1 = { "asdf", "qwer" },
    List2 = new List<string> { "zxcv", "1234" }
};
Run Code Online (Sandbox Code Playgroud)

所以,在List2的情况下,没关系,使用"="我们设置属性.但是在List1的情况下,它看起来像我们设置属性,但实际上,我们假设在之前设置它,在这里我们只设置值.它与数组初始化非常相似:

string[] arr = { "val1", "val2" }
Run Code Online (Sandbox Code Playgroud)

为什么C#在这里使用这种令人困惑的语法?

编辑:我想我用C#6.0语法让很多观众感到困惑,但这不是重点.让我们使用旧的C#3.0和.net 2.0.并且让我们添加更多乐趣,并从头开始添加一些值("1"和"2")到列表中,正如Jeff Mercado建议的那样:

class Program {
    static void Main(string[] args) {
        ObjectList objectList = new ObjectList {
            List1 = { "asdf", "qwer" },
        };
    }
}
class ObjectList …
Run Code Online (Sandbox Code Playgroud)

c#

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

代码合同.net - 替代品

最近,我开始使用.net的代码合同.在我看来,代码签约本身的想法很棒,但实现起来非常不愉快.

我不喜欢它的主要原因是:

  • 我只能使用像Contract.Require()我的程序里面的方法.ContractAbbreviators有很多限制(比如,我不能将它们放在一个单独的程序集中,我不能使用参数),这使得它们的可用性降低.没有属性,也没有扩展方法,所以我的代码变得非常冗长.例如,如果我只是想检查我的返回值类型Dictionary<string, string>是否为null,我需要添加一个怪物,如Contract.Ensure(Contract.Result<Dictionary<string, string>> != null).它甚至都不可读.
  • 静态分析仪发出了很多错误警报,我花了更多时间来关闭它而不是解决实际问题.
  • 这非常慢.尽管它有一些缓存,但即使是一个小项目也需要几分钟的时间来分析,这使得增量修复变得毫无用处.这只需要太长时间.
  • 有一些错误ccrewriter- 它不能咀嚼一半的程序集,并且它无法在.net 4.5运行时中存活.net 4.0程序集.
  • 有运行时/静态检查器二元论.当我刚刚开始时,我认为这很简单Debug.Assert- 你只需将它们添加到你认为需要的任何地方.但事实证明,我需要向静态检查器证明一切,这是肯定的,但检查器有时是愚蠢的,无法解决许多明显的代码结构(如while).并且没有任何工具可以对分析仪说"我知道我在做什么,只是忽略这违反合同".
  • 你无法联系条件.例如,没有办法向静态分析器解释如果我检查string.NotNullOrEmpty这包括string != null.或者,如果我有自己的大程序检查文件路径,我无法向分析器解释它肯定不是null而不是空的.该ContractAbbreviator属性帮助一点点,但所有这些冗长去那里,它仍然看起来肮脏和愚蠢的.
  • 代码合同的开发速度非常慢,即使它现在是开源的,据我所知,代码库处于不良状态.

代码合同是否有任何先进的替代方案,缺陷较少?

.net code-contracts

4
推荐指数
1
解决办法
1302
查看次数

嵌套泛型<T1 <T2 >>

为什么写这样的东西是不可能的:

T1<T2> Method<T1, T2>(T1<T2> genericValue) { ... }
Run Code Online (Sandbox Code Playgroud)

例如,我想编写一个扩展方法,它接受一个通用对象,包含一个通用的集合:

Container<CT<T>> ExtensionMethod<CT, T>(Container<CT<T>> value) { ... }
Run Code Online (Sandbox Code Playgroud)

其中CT可以是Array,List或任何其他集合类型,T是任何类型.但编译器说"类型参数T1没有类型参数".

那有什么解决方法吗?

c# generics

4
推荐指数
1
解决办法
392
查看次数

从.NET中的混淆中排除构造函数

在.NET中有ObfuscationAttibute.但我不明白,如何从混淆中排除构造函数内部的代码.

// Obfuscated class
class MyClass {
    [Obfuscation(Exclude = true)] // "Attribute 'Obfuscation' is not valid on this declaration type"
    public MyClass() {
        //some code, I need to exclude this code from obfuscation
    }
    // Obfuscated method
    public void Method1() {
        //some code
    |
    // Obfuscated method
    public void Method2() {
        //some code
    |
}
Run Code Online (Sandbox Code Playgroud)

UPD:问题不是重命名构造函数.它的名字显然变成了".ctor".我需要防止代码本身的混淆.是的,一些混淆器不仅重命名符号,还改变代码.是的,我知道我不能用这个属性来做.编译器也这么说.我已经知道我不能做什么.我问我能做什么,最好只使用标准的.net工具.

.net c# obfuscation

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

是否可以通过 Visual Studio Code 创建 Windows 服务?

在我的 Visual Studio 代码项目中,我.exe为该项目生成了一个文件,我正在尝试 create make my .exeas Windows Service。

这里这里,如果我没记错的话,这些解决方案看起来像是使用 Visual Studio 而不是 Visual Studio Code 完成的。是否可以通过 Visual Studio Code 创建窗口服务?

c# visual-studio visual-studio-code

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

如何通过 .NET/C# 获取 mp3 文件的持续时间?

我需要创建一个 mp3 歌曲的 M3U 播放列表。

有没有办法读取MP3文件的时长属性?

.net c# mp3

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