我需要澄清一下:
作为运营商
out/ref参数修改器
类型
只回答你知道的或你想回答的,如果你不想回答,就不要回答整个问题。
是的,我要求澄清这些问题。纠正我或补充我已经说过的话。
好吧,我已经在谷歌上搜索了一些,并登陆了各种网站,MSDN等等。我仍然需要有人写一些代码来帮助我澄清整个概念,并最终让我充分使用它,希望这对其他人也有帮助。
基本上这就是我所理解的:
A) 是
伪码
如果对象是这种类型,则返回true,否则返回false
简单。或者我在这里做错了什么?
某些类型是否存在任何限制或问题?
这个代码运行得很好,所以我想我做得很好。
object s = new SqlBoolean();
if (s is SqlBoolean)
{
Console.WriteLine("Is SqlBoolean");
Console.ReadLine();
}
2) 作为
嗯,我还是要完全理解这一点。
MSDN报告:
as运算符用于在兼容的类型。as运算符类似于强制转换,只是它在转换失败,而不是引发异常。
好吧,我在Object数组上尝试了一个循环,它基本上只转换基元,而且有很多问题(每次铸造都会抛出null或其他什么)
I.e
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、SqlBoolean等
请注意,我正在使用末尾带有问号的行"SqlString?"强制SqlString为null(?强制为null,谁知道呢!:D)。
所以基本上,它对于在不使用异常的情况下进行一些低级别转换是有用的?还是怎样
3) 参考和输出
基本上ref改变了函数中预先声明的变量的值:
IE
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删除两个ref将输出20 10
(ref直接更改外部声明的x,而不在方法中创建实例)
出去怎么样?有什么用
我搞不懂。从某个地方读,它似乎是一个与ref相同的参数,但它可以让你以某种方式获得一些输出参数。
在前面显示的代码中使用out而不是ref只会产生IntelliSense的编译错误,我甚至不知道如何显示这些out参数。
在我正在做的一个项目中,我使用以下代码:
public static Array check(string country, string vatNum)
{
bool valid;
string name;
string address;
checkVatService vatchecker = new checkVatService();
vatchecker.checkVat(ref country, ref vatNum, out valid, out name, out address);
return new object[] {country,
vatNum,
valid,
name,
address
};
}
现在,checkVat是来自欧洲在线检查网络服务的一些代码。
我看到它有out参数,它们是由wsdl Web服务消费库从Web服务网站生成的(如果需要,链接到库)
如何使用out参数?它们是否可以在不使用return的情况下进行一些输出?我如何使用它们?请提供非常详细的
4) 类型的
这将从系统返回类型。您传递给它的类型的类型。
首先,我想我可以得到我传递给它的任何对象的类型,比如
int x;
SqlBoolean xy = new SqlBoolean();
typeof(x) // integer
typeof(xy) // SqlBoolean
但事实并非如此。
它只是从System.type.返回类型
像
typeof(int).ToString()//System.Int32或类似的类型typeof(xy).ToString()//System.Data.SqlTypes.SqlSqlBoolean
我真的不知道该怎么办。
为了获得对象的类型,你必须做一些类似的事情。从一个对象中获取类型。
那么typeof的实际用途是什么?我缺少什么?
感谢所有
大问题。。小答案:
- 正确
- 它允许强制转换无异常地失败。因此,您可以检查结果是否为
null
。如果是,则强制转换失败 ref
通过引用传递对象(注意:尽管如此,仍然通过值传递语义!)。out
意味着在函数退出之前必须为其赋值- 我不确定我是否理解你对
typeof
的问题。如果你不明白为什么它可能有用(真的和任何东西一样),最好不要理会它的使用
你答对了a)问题。
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
对于其余部分和以上内容,本代码项目教程(分为两部分)可能会有所帮助:
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运算符的用途是抑制错误大小写的异常,以便在强制转换错误时抛出null
3) 参考请参考下面的链接,这里给出了详细的解释为什么使用';ref';传递对象时使用关键字
4) out参数通常用于需要从函数返回多个值的情况。一个值使用return语句直接返回,其他值使用out参数返回。例如,请参阅c#中out参数的用法。你可以在那里找到琼·斯凯特的优秀文章
5) 在某些情况下,您可能希望检查对象的类型以执行某些操作,但根据RTTI设计原则,大多数情况下都不应该使用此操作。
类型的、GetType和是都不同,可以输出不同的结果。请参阅这篇SO文章,因为这里有我见过的最简单的解释。
ref和out
默认情况下,方法的参数是通过值传递的,这意味着参数的值在传递给方法时会被复制。如果您有foo(int y){y = 9;} main(){int x = 5; Foo(x);}
,方法Foo将x的值复制到y,然后为y指定一个不同的值。x仍然保持为5。如果您有引用类型参数,如Foo(object y){y = null;} main(){object x = new object(); Foo(x);}
,y包含一个复制的x值,它是一个引用值,而不是对象本身。因此,对y所做的更改也不会反映在x中。相反,ref和out是通过引用传递的:
// 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
}
当然,您可以打破ref/out的设计目的,并通过为变量分配初始值来使用ref代替out,但这没有逻辑意义,可能会混淆代码读取器。(即,在搜索同义词之前,你是如何知道它们的?为什么你会给它分配一个不正确的初始值?等等)
进一步说明:
int=System.Int32
和SqlBoolean=System.Data.SqlTypes.SqlBoolean
。int只是一个别名,可能是由于传统的原因,而System.Int32
是C#类型的完整表示/名称。什么使int x
暴露于x.Equals
、x.ToString
或x.Parse
等方法?System.Int32.在C#中,类型是具有定义数据或引用类型的成员的类(例如System.Int32)。
这是我自己获得out和ref概念后的真实答案。
Ref->当您之前在调用的方法之外初始化了一个变量,并且希望该方法为其分配一个结果值时,您会将一个param作为Ref传递。
Out->当您调用的方法之外的变量可能被赋值或未被赋值时,您将参数作为输出传递,并且您希望该方法将结果值赋予它
As->在不引发异常的情况下执行强制转换。
此外,此