草庐IT

c# - “C++ void Pointer”和 “C# var”之间的区别

coder 2023-05-31 原文

在学习C#时,我想到了这个问题。 voidvar有什么区别?
这是我要分享的两个示例:

void * voidInt = (void *) 7;
void * voidChar = (void *) 'F';
void * voidCharArray = (void *) "AbcString";

这是var的示例:
var varInt = 7;
var varChar = 'F';
var varCharArray = "AbcString";
  • void是匿名数据类型吗?
  • 如果是,那么主要是什么varvoid之间的区别?

  • 有人可以帮我解决这种情况吗?

    最佳答案

    这里的其他答案还不错,但我认为它们并不清楚基本面。这是您困惑的基础知识,所以让我们解决这些问题。

  • 变量是包含值的存储位置。
  • 变量与类型关联。
  • 局部变量具有名称。

  • 因此voidIntvoidCharvoidCharArrayvarIntvarCharvarCharArray都是变量,并且它们都具有与之关联的类型。可以为每个变量分配该类型的值或产生该类型的值,具体取决于该变量是被写入还是从中读取。

    OK,那么指针是什么?
  • 类型具有对应的指针类型。 (请注意,在不安全的C#中,只有非托管类型才具有相应的指针类型。)
  • void *类型是一种特殊的指针类型。
  • 指针是一个值。
  • 可以取消引用T*类型的指针以产生T类型的变量。 T*不得为void*
  • 可以将指针显式转换为任何整数类型或从任何整数类型转换为指针,但是允许这些操作丢失信息并且取决于实现细节。
  • 任何指针值都可以隐式转换为void*
  • 任何void*值都可以显式转换为任何指针类型值。

  • C#中的var是什么?
  • var是一个“语法糖”,它告诉编译器从初始字体中推断出变量的类型,而不是要求将其写出。

  • 什么是C#中的“匿名类型”?
  • C#中的某些表达式的类型未声明且没有名称。这些被称为“匿名”类型。

  • 现在,我们可以看一下您的程序,看看每一行的功能。
    void * voidInt = (void *) 7;
    
    voidIntvoid*类型的变量。分配给它的值是整数7到指针的转换,几乎可以肯定这是任何现代操作系统上的垃圾指针。此代码本质上是荒谬的。

    更明智的代码是:
    int myInt = 7;
    int* intPtr = &myInt;
    void* voidInt = intPtr;
    

    这意味着myInt是保存值7的变量,intPtr是保存指针的变量;当该指针被取消引用时,它会产生变量myIntvoidInt是一个保存任何指针的变量,从intPtr读取的值是一个指针。因此,现在voidIntintPtr都拥有一个指向变量myInt的指针。
    void * voidChar = (void *) 'F';
    

    这里也是一样。字符F视为数字,并转换为指针值,该值存储在变量中。这是不明智的。明智的代码如下所示:
    char myChar = 'F';
    void *voidChar = &myChar;
    

    但这完全有道理:
    void * voidCharArray = (void *) "AbcString";
    

    C++中的字符串文字可以转换为char*,它是指向第一个字符的存储的指针,并且该指针可以转换为void*

    那这个呢?
    var varInt = 7;
    var varChar = 'F';
    var varCharArray = "AbcString";
    

    这只是一种令人愉快的写作方式
    int varInt = 7;
    char varChar = 'F';
    string varCharArray = "AbcString";
    

    每个变量都有其给定的类型,每个赋值在变量中存储该类型的值。

    匿名类型呢?
    var anon = new { X = 123, Y = 456 };
    

    这将创建一个匿名类型的变量,其中匿名类型具有两个属性X和Y,它们的类型均为int。该类型没有名称,因此无法在声明中写出该类型,因此必须使用var

    这里的关键是要确保您掌握了基础知识:指针是值,它们可以被取消引用,并且这样做会产生一个变量。由于指针是值,因此它们本身可以存储在指针类型的变量中。这几乎与var无关,这是C#中使编译器完成确定变量应具有的类型的一种令人愉快的方式。

    关于c# - “C++ void Pointer”和 “C# var”之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27728875/

    有关c# - “C++ void Pointer”和 “C# var”之间的区别的更多相关文章

    1. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    3. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

      请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

    4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

      在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

    5. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

      我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

    6. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    7. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

      我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

    8. C# 到 Ruby sha1 base64 编码 - 2

      我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

    9. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

      给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

    10. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    随机推荐