C# “as” operator and advanced conversion use in loops/functions and out/ref parameters modifiers and typeof()
我需要澄清一下:
IS/AS算子
out/ref参数修改器
类型
如果你不喜欢的话,你可以只回答你知道的或者你想回答的问题,而不是整个问题。
是的,我想澄清一下。纠正我,或者补充我已经说过的话。
嗯,我在谷歌上搜索了一点,然后登陆了不同的网站,msdn等等。我仍然需要有人写一些代码来帮助我澄清整个概念,最后让我充分利用它,希望这对其他人也有帮助。
基本上这就是我理解的:
a)
伪码
如果对象是此类型,则返回true,否则返回false
容易的。或者我在这里做错了什么?
某些类型有什么限制或问题吗?
这段代码运行得很好,所以我想我做得很好。
1 2 3 4 5 6 |
2)
好吧,我还是要完全理解这一点。
MSDN报告:
The as operator is used to perform conversions between compatible
types. The as operator is like a cast except that it yields null on
conversion failure instead of raising an exception.
我在一个对象数组上尝试了一个循环,它基本上只转换原语,并且有很多问题(每一个强制转换都有一点困难,就会抛出空值或其他东西)。
即
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | using System; using System.Data.SqlTypes; class StackOverflow { public static void Main() { string country ="jii"; string vatNum="dde"; object[] MyObjects = {country, vatNum }; for (int i = 0; i<=MyObjects.Length-1;i++) { MyObjects[i] = MyObjects[i] as SqlString?; Console.WriteLine(MyObjects[i].ToString() +"" + MyObjects[i].GetType()); Console.ReadLine(); } } } |
在我制作的程序中,我需要将这些值转换为sqlstrings、sqlbooleans等。
请注意,我正在用"sqlstring?"行强制sqlstring为空。结尾有问号(?力为零,谁知道呢!D)。
所以基本上,它对于在不使用异常的情况下进行一些低级转换很有用?或者什么?
3)REF和OUT
基本上,ref改变了函数中预先声明的变量的值:
工业工程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | using System; class StackOverflow { public static void Main() { int x = 10; Write(func(ref x).ToString()); Write(Convert.ToString(x)); } public static int func(ref int y) { y += 10; return y; } public static void Write(string z) { Console.WriteLine(z); Console.ReadLine(); } } |
执行此操作将正常,输出将为20 20删除两个参考将输出20 10
(ref直接更改外部声明的x,而不在方法中创建实例)
出去怎么样?有什么用?????
我拿不到。在某个地方读取,它看起来像是一个执行相同的ref的参数,但它可以让您以某种方式拥有一些输出参数。
在前面显示的代码中使用out而不是ref只会通过intellisense产生编译错误,我甚至不知道如何获取要显示的out参数。
在我正在执行的项目中,我使用以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
现在,checkvat是来自欧洲在线检查Web服务的一些代码。
我看到它有一些参数,它们是由WebService网站的WSDL WebService消费库生成的(如果需要,链接到库)。
如何使用out参数?它们是否有一些不使用返回的输出?我如何使用它们?请非常详细
4)类型
这将从System返回类型。传递给它的类型的类型。
首先我想我可以得到我传递给它的任何物体的类型
但事实并非如此。
它只是从System.Type返回类型。
喜欢
typeof(int).toString()//system.int32或类似的类型typeof(xy).toString()//system.data.sqltypes.sqlsqlbolean
我真的不知道该怎么办。
为了得到一个对象的类型,你必须做一些类似的事情,从一个对象中获取类型。
那么排字的实际用途是什么,我遗漏了什么?
谢谢任何人
大问题..小答案:
typeof,gettype,is都是不同的,可以输出不同的结果。请参考这篇文章,因为这里有我见过的最简单的解释。
参考与输出
默认情况下,方法的参数是按值传递的,这意味着当传递给方法时,参数的值会被复制。如果您有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | // Example of ref: // p DOES NOT copy x's reference value of the object // p is x (or refer to the same memory as x) class Ref_Example { static void Foo(ref int p) { p = 8}; static void Main() { int x = 5; Foo(ref x); Console.WriteLine(x); // output: 8 } } // Example of out: // out = ref, except variables need not be assigned before method is called // You use out when you have to return multiple values from a function Class Out_Example { static void Find_Synonyms( string vocab, out string synonymA, out string synonymB) { // Lookup the synonyms of the word"rich" }; static void Main() { string a, b; Find_Synonyms("rich", a, b); Console.WriteLine(a); // abundant Console.WriteLine(b); // affluent } |
当然,您可以打破为什么设计的引用/输出,并通过给变量分配一个初始值来使用引用代替输出,但是它没有逻辑意义,可能会混淆代码阅读器。(即,在搜索同义词之前,您如何知道这些同义词?为什么你给它分配了一个不正确的初始值?等)
进一步说明:
int=
你答对了的问题。
b)也许这会带来光明-
http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx
和
http://msdn.microsoft.com/en-us/library/ms173105.aspx
对于其余部分和以上内容,本codeproject教程(分两部分)可能会有所帮助:
http://www.codeproject.com/Articles/3114/C-Keywords-Part-I-Modifier-Keywords
http://www.codeproject.com/Articles/3424/C-Keywords-Part-II-Type-Conversion-Operators-and-O
1)关于IS操作员,您是正确的。2)as运算符的使用是,它抑制错误情况的异常,以便当强制转换错误时,它抛出空值。3)对于引用,请参考下面的链接,这里给出了详细的解释,为什么在传递对象时使用"ref"关键字?4)out参数通常用于需要从函数返回多个值的情况。一个值使用RETURN语句直接返回,另一个值使用OUT参数返回。例如,清晰的理解是指C中out参数的用法。你可以在那里找到乔恩·斯基特的优秀文章。5)可能会出现需要检查对象类型以执行ceratain操作的情况,但大多数情况下不应根据rtti设计原则使用。
这是在我了解了out和ref的概念之后的真实答案。
当您先前在调用的方法之外初始化了一个变量,并且希望该方法为其分配一个结果值时,您可以将一个参数作为ref传递。
out->当您调用的方法之外的变量可能已被分配或未被分配,并且您希望该方法将结果值赋给它时,可以将参数作为输出传递。
as->在不引发异常的情况下执行强制转换。
而且,这个