C#”;作为“;运算符和高级转换在循环/函数和out/ref参数修饰符和typeof()中使用

本文关键字:参数 typeof ref 函数 运算符 作为 高级 转换 循环 out | 更新日期: 2023-09-27 18:23:46

我需要澄清一下:

作为运营商

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的实际用途是什么?我缺少什么?

感谢所有

C#”;作为“;运算符和高级转换在循环/函数和out/ref参数修饰符和typeof()中使用

大问题。。小答案:

  1. 正确
  2. 它允许强制转换无异常地失败。因此,您可以检查结果是否为null。如果是,则强制转换失败
  3. ref通过引用传递对象(注意:尽管如此,仍然通过值传递语义!)。out意味着在函数退出之前必须为其赋值
  4. 我不确定我是否理解你对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.Int32SqlBoolean=System.Data.SqlTypes.SqlBoolean。int只是一个别名,可能是由于传统的原因,而System.Int32是C#类型的完整表示/名称。什么使int x暴露于x.Equalsx.ToStringx.Parse等方法?System.Int32.在C#中,类型是具有定义数据或引用类型的成员的类(例如System.Int32)。

这是我自己获得out和ref概念后的真实答案。

Ref->当您之前在调用的方法之外初始化了一个变量,并且希望该方法为其分配一个结果值时,您会将一个param作为Ref传递。

Out->当您调用的方法之外的变量可能被赋值或未被赋值时,您将参数作为输出传递,并且您希望该方法将结果值赋予它

As->在不引发异常的情况下执行强制转换。

此外,此