|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一般的指的.net就是跟java相对的那种,主要是做企业级应用的。你如果想学这个,主要就是学C#和数据库。(ASP.NET好像很重要的,应该也要学的,ASP.NET上好像可以结合VB和C#等多种语言,但是微软主推C#)字符串1.有字符串型的列举吗?
UK在《关于列举的各种》中提到如许一个成绩:
列举的成员范例都是数值型的,假如想做一个字符型的列举有甚么举措?
enumcolors:string{
red=#ff0000,
}
在睁开会商之前,我以为有需要弄分明另外一个成绩,下面代码中的#ff0000不是字符而是字符串,应改成"#ff0000",因而,UK的成绩也顺遂成章地改成“想做一个字符串型的列举有甚么举措”了。
很坦率地说,.NET其实不撑持如许的字符串型列举。别的,也不是一切的数值范例都能作为列举的底层范例,列举的底层范例只能是整数范例,这意味着某天你想界说一个底层范例为double的列举,你将会收到编译器的告诫信。
UK的代码的确提出了如许一种需求,colors就像一个列举,但其成员的值是一个字符串,因而,我们很简单发生如许一个疑问:是不是可以摹拟出如许一个列举呢?
2.有举措摹拟出来吗?
在写任何代码之前,让我们起首思索一下,假设真有如许一个Color类,我们会如何利用它?以下是我想到的两个用法:
1//Code#01
2
3Colorc1=Color.Red;
4strings1=(string)c1;
5Debug.Assert(s1=="#FF0000");
6
7Colorc2=(Color)"#00FF00";
8Debug.Assert(c2==Color.Green);
起首,列举是经由过程其成员而不是机关函数来初始化的,正如下面代码的第三行。因而,我们应当把机关函数设为公有,同时摹拟一些列举成员并表露出来:
//Code#02
publicclassColor
{
privateColor(stringvalue)
{
m_Value=value;
}
privatestringm_Value;
publicstaticreadonlyColorRed=newColor("#FF0000");
publicstaticreadonlyColorGreen=newColor("#00FF00");
publicstaticreadonlyColorBlue=newColor("#0000FF");
}
如许,Code#01的第三行就能够事情了。值得提示的是,Red、Green和Blue等成员的值都是稳定的,为了不让客户代码修正它们的值,我把它们设成readonly(注重:它们不成以设为const,你晓得为何吗?)。别的,它们应当属于Color类而不是某个实例的,因而把它们设成static。
接着,Code#01的第四行申明了Color的实例能够强迫转换成字符串,这能够经由过程重载转换运算符做到:
//Code#03
publicstaticexplicitoperatorstring(Colorvalue)
{
returnvalue.m_Value;
}
与Code#01的第四行对应的是Code#01的第七行,它申明了字符串能够强迫转换成Color实例,这也是经由过程重载转换运算符做到的:
//Code#04
publicstaticexplicitoperatorColor(stringvalue)
{
switch(value)
{
case"#FF0000":
returnRed;
case"#00FF00":
returnGreen;
case"#0000FF":
returnBlue;
default:
thrownewInvalidCastException();
}
}
很分明,并非一切的字符串都能够转换成Color实例,以是,当客户代码试图把一个含有非预期值的字符串转换成Color实例时就应当抛出InvalidCastException了。
固然,有些人会对Code#04很恶感,由于它内里有一个switch!当我们利用列举时,我们其实不只是用它来举行一些值的转换大概猎取其字面值,我们更但愿用它来标识分歧的情形大概种别,并依据列举实例的值来判别属于哪一情形或种别。换句话说,当我们决意利用列举时,我们就必定与前提语句结下不解之缘了。
最初,这里给出Color的完全代码:
//Code#05
Color#regionColor
publicclassColor
{
privateColor(stringvalue)
{
m_Value=value;
}
publicstaticexplicitoperatorColor(stringvalue)
{
switch(value)
{
case"#FF0000":
returnRed;
case"#00FF00":
returnGreen;
case"#0000FF":
returnBlue;
default:
thrownewInvalidCastException();
}
}
publicstaticexplicitoperatorstring(Colorvalue)
{
returnvalue.m_Value;
}
publicoverridestringToString()
{
returnm_Value;
}
publicstaticreadonlyColorRed=newColor("#FF0000");
publicstaticreadonlyColorGreen=newColor("#00FF00");
publicstaticreadonlyColorBlue=newColor("#0000FF");
privatestringm_Value;
}
#endregion
也许有人会提出如许一个成绩:我们常常会对列举举行判等运算,但为何Code#05中既没有重载Object.Equals办法,也没有供应==和!=运算符呢?仔细察看Color的代码,你会发明猎取Color的实例只要两种路子:经由过程静态只读字段和经由过程强迫转换运算符,但不管你是怎样失掉Color的实例,这些实例终极都是源自Color外部的静态只读字段。换言之,经由过程这两种路子分离取得的两个Color实例实际上是统一个实例。
3.摹拟计划有甚么成绩吗?
我信任,Color在必定水平上可以满意UK的需求了,可是,我以为Color其实不必定能用到实践的使用中往。回忆Code#05,Color既是一个列举也是一个数据载体。说它是列举,是由于我们决心把它摹拟成列举;说它是一个数据载体,是由于我们其实不仅仅以列举的体例来用它,我们更必要的是成员面前所代表的值。这意味着Color承当的义务多于一个,违背了单一义务准绳(SRP)。
我嫌疑,UK之以是对Color有如许的希冀,或多或少是遭到了《关于列举的各种》中列举成员的值那部份内容的影响,特别是“为何必要手动指定列举成员的值?”这个成绩的谜底。假如真是如许,我必需就该文发生误导在此向你报歉。实际的情形常常不会像该文的Code#13那样复杂,不仅统一范例的主顾(比方白金会员)所能享用到的扣头随时会产生变更,并且统一的商品在分歧的时代(比方促销期)的扣头也有大概分歧,因而主顾终极所能享用到的扣头多是一个经由庞大运算的综合扣头。任何对变更要素的硬编码城市招致体系的僵化!我倡议在浏览该文这部份内容时应以研讨列举的这方面特征为目标。
另外一方面,Color作为一个数据载体,它的确弱得不幸。今朝它仅包括R、G、B三个通道的数据,假如我想到场alpha通道的数据呢?这会对它的代码发生多年夜的打击?假如我但愿它能分离为我提取A、R、G、B四个通道的数据呢?假如我但愿完成RGB和CMYK之间的数据转换呢?我信任这些成绩已充足让你头痛一周了,但当你晓得人的肉眼可以辨认的色彩约有一千六百万种,而这些色彩都能够经由过程RGB值来形貌并作为显现器输入的根据,你的鼠标会不会即刻指向扫瞄器右上角的交织呢?
很分明,这里所给出的Color是经不起工夫的磨练的,因而我不由在想,.NETFramework事实怎样表达Color呢?它又是怎样满意这些让人苦闷的需求呢?
4..NETFramework又怎样表达Color呢?
在.NETFramework中,和这里所提到的需求相干的器材有3个:Color布局、KnownColor列举和ColorTranslator类,它们都位于System.Drawing定名空间中。
起首说说KnownColor列举,它的成员能够分红两类:一类是着名字的色彩,与它们对应的RGB值是稳定的,如Indigo是靛蓝;另外一类是表面项目标色彩,与它们对应的RGB值会跟着用户的设置而改动,如InfoText是工具提醒文本的色彩。
其次是Color布局了,它有良多静态属性,这些属性都是猎取与KnownColor列举中第一类成员对应的Color实例。它还供应FromKnownColor和ToKnownColor办法用于完成它的实例和KnownColor列举之间的转换。固然,因为它是一个数据载体,它包括了A、R、G、B四个通道的数据,对它的实例的判等就相称于对这些数据举行判等,因而它也重载了==和!=运算符。
说了这么多,仿佛还没有提到怎样从Color实例失掉HTML色彩值,好吧,如今是时分让ColorTranslator类退场了。该类供应ToHtml和FromHtml办法用于完成Color实例和HTML色彩值的字符串之间的转换。
这三个器材的义务都很了了,当你必要判别某个中央用的是不是某种色彩时,没有需要往对照它们的A、R、G、B四个通道的数据,你真正必要的只是一种快而准的标识对照,KnownColor列举恰好就可以满意这方面的请求;当你必要操纵某种色彩的数据时,你实在其实不但愿操纵一个字符串,Color布局能让你容易提取所需的数据;当你在色彩数据和HTML色彩值的字符串之间举行转换时,你实在其实不太必要一个列举来做标识。但是,你也有大概分离它们三个一同利用,上面给出一个例子作为本文的扫尾:
//Code#06
stringdesktopColorValue=ColorTranslator.ToHtml(Color.FromKnownColor(KnownColor.Desktop));
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。 |
|