假设,我们有一个非常简单的类:
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) 最近,我开始使用.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属性帮助一点点,但所有这些冗长去那里,它仍然看起来肮脏和愚蠢的.代码合同是否有任何先进的替代方案,缺陷较少?
为什么写这样的东西是不可能的:
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没有类型参数".
那有什么解决方法吗?
在.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工具.
我需要创建一个 mp3 歌曲的 M3U 播放列表。
有没有办法读取MP3文件的时长属性?