2011-11-16 24 views
2

而是写作任何人都知道我可以如何获得用于c#类型的FCL样式初始化语法?

int i = new int(); 
i = 7; 

可以写

int i = 7; 

有没有一种方法可以让我得到初始化的这种风格对我自己的类型?

MyType mt = xyz; 
+0

。 –

+1

这是什么'xyz'? –

+0

没什么。但是,举个例子,我想写一个自定义字符串类 - String2。我可以设计它,使它初始化为String2 s2 =“yo”。或者我坚持让它看起来像String2 s2 =新的String2(“哟”)或一些这样的详细程度。我只是寻找简洁的FCL原语在我自己的类型中使用。 – endlessnameless

回答

2

您可以最接近的是通过在您的类型上创建隐式转换。例如:

public class Unit 
{ 
    public static implicit operator Unit(string val) 
    { 
    return Unit.Parse(val); 
    } 

    public static Unit Parse(string unitString) 
    { 
    // parsing magic goes here 
    } 
} 

这将使您能够做这样的事情:

Unit width = "150px"; 
var width = Unit.Parse("150px"); // equivalent to previous line 

请注意,你不能引入新的语法;这将是不可能来实现:

Unit width = 150px; 

因为150px并不代表一个有效的值类型。

请注意,隐式转换可能会让您以奇怪的方式陷入困境,因此请不要这样做。只支持向你真正需要的类型进行隐式转换。

或者,如果您正在使用C#编译器3.5或多达你也可以使用内联初始化是更冗长,但也更加明确:

Unit with = new { Value=150, UnitType=Units.Pixel }; 
0

简短的回答是“不,你不能。”你总是会在某个地方隐藏new

在特定情况下,你可以做一些技巧与隐式转换是这样的:

class String2 { 
    private readonly string WrappedString; 

    public String2(string wrappedString) { 
     this.WrappedString = "my modified " + wrappedString ; 
    } 

    public override string ToString() { 
     return this.WrappedString; 
    } 

    // the "magic" is here: the string you assign to String2 gets implicitly 
    // converted to a String2 
    public static implicit operator String2(string wrappedString) { 
     return new String2(wrappedString); 
    } 
} 

,使您能够做到:

String2 test = "test"; 
Console.WriteLine(test.ToString()); // writes: "my modified test" to the Console 

,但你的“新”藏在隐无论如何转换。

这可能是更普遍和土地你不能从你想要的语法太远另一种方法是通过扩展方法:

static class StringExtensions { 
     public static String2 ToString2(this string that) {return new String2(that);} 
    } 

与范围,你可以这样做:

var test2="anothertest".ToString2(); 
+0

谢谢。隐式转换是什么MSFT用来允许快速初始化为int /字节/字符串等? – endlessnameless

+1

不,不是。原始类型,如int/byte/string,得到编译器的特殊处理。 –

0

对于评论中的具体示例,您可以将implicit conversion operator添加到该类型中。

请注意,通常不建议这样做,因为它会使您的代码不易读。例如,像String2 s2 = new String2("yo")这样的东西完全明确发生了什么;不像String2 s2 = "yo"这样的东西。

String2 s2 = "yo"; 

// ... 

public sealed class String2 
{ 
    public readonly string _value; 
    public string Value { get { return _value; } } 

    public String2(string value) 
    { 
     _value = value; 
    } 

    public override string ToString() 
    { 
     return Value; 
    } 

    public static implicit operator String2(string value) 
    { 
     return new String2(value); 
    } 
} 
+0

这是rad!我喜欢。我不介意它不那么“可读”,因为它是为我自己的代码而不是库。什么是可读的呢?除了微软允许它工作以外的事情有效吗?就我个人而言,我很困惑为什么某些类型可以用语法糖初始化,而其他类型则不能。你必须深入研究框架来计算int和string是如何用语法糖来实现的,但它并没有被明确给我们。对于我自己的类型,如果我写它,它对我来说是明确的。谢谢! – endlessnameless

相关问题