Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串和C中的字符串有什么区别?_C#_.net_String_Types_Alias - Fatal编程技术网

C# 字符串和C中的字符串有什么区别?

C# 字符串和C中的字符串有什么区别?,c#,.net,string,types,alias,C#,.net,String,Types,Alias,示例说明案例: 字符串s=你好,世界!; 字符串s=你好,世界!; 使用每种方法的指导原则是什么?有什么区别呢?是C语言中的别名。 所以从技术上讲,没有区别。就像 根据指导原则,通常建议在引用对象时使用字符串 e、 g 同样,我认为如果需要专门引用类,通常建议使用String e、 g 这是微软倾向于使用的风格。 这方面的指导可能已经改变,因为现在强制使用C特定的别名。System.String是.NET字符串类-在C字符串中是System.String的别名-因此在使用中它们是相同的 至于指导

示例说明案例:

字符串s=你好,世界!; 字符串s=你好,世界!; 使用每种方法的指导原则是什么?有什么区别呢?

是C语言中的别名。 所以从技术上讲,没有区别。就像

根据指导原则,通常建议在引用对象时使用字符串

e、 g

同样,我认为如果需要专门引用类,通常建议使用String

e、 g

这是微软倾向于使用的风格。 这方面的指导可能已经改变,因为现在强制使用C特定的别名。

System.String是.NET字符串类-在C字符串中是System.String的别名-因此在使用中它们是相同的

至于指导原则,我不会陷入太多的泥沼,只使用你喜欢的东西——生活中有更重要的东西,代码无论如何都是一样的

如果您发现自己构建的系统需要指定所用整数的大小,因此倾向于使用Int16、Int32、UInt16,UInt32等。然后使用字符串可能看起来更自然—在不同的.net语言之间移动时,可能会使事情更容易理解—否则我会使用字符串和int。

小写字符串是System.String的别名。 它们在C中是相同的


关于是否应该使用System类型System.Int32、System.String等类型还是C别名int、String等类型存在争议。我个人认为应该使用C别名,但这只是我个人的偏好。

我所听到的关于在C中使用提供的类型别名的最好答案来自Jeffrey Richter在他的书中。以下是他的三个理由:

我看到许多开发人员感到困惑,不知道在他们的代码中是使用字符串还是字符串。因为在C语言中,字符串a关键字正好映射到System.string FCL类型,所以两者没有区别,可以任意使用。 在C中,long映射到System.Int64,但在另一种编程语言中,long可以映射到Int16或Int32。事实上,C++/CLI确实将long视为Int32。如果阅读一种语言的源代码的人习惯于使用另一种编程语言编程,那么他或她很容易误解代码的意图。事实上,大多数语言甚至不会将long视为关键字,也不会编译使用long的代码。 FCL有许多方法,它们的方法名中包含类型名。例如,BinaryReader类型提供ReadBoolean、ReadInt32、ReadSingle等方法,System.Convert类型提供ToBoolean、ToInt32、ToSingle等方法。尽管编写以下代码是合法的,但我觉得带有float的行非常不自然,而且这行是否正确并不明显:
好了。我认为这些都是很好的观点。然而,我发现自己并没有在自己的代码中使用Jeffrey的建议。也许我太沉迷于我的C世界了,但我最终还是试图让我的代码看起来像框架代码。

这是一个惯例问题,真的。字符串看起来更像C/C++风格。一般惯例是使用所选语言为Int32提供的int/int的任何快捷方式。这也适用于object和decimal

从理论上讲,这有助于将代码移植到未来的64位标准中,其中int可能表示Int64,但这不是重点,我希望任何升级向导都能将int引用更改为Int32,以确保安全。

有一个区别-不使用System不能使用String;事先。

出于格式方面的原因,我更喜欢大写的.NET类型而不是别名。NET类型的颜色与其他对象类型相同。毕竟,值类型是正确的对象

条件关键字和控制关键字(如if、switch和return)默认为小写,颜色为深蓝色。我宁愿在使用和形式上没有分歧

考虑:

字符串;字符串; 另一串;
使用系统类型可以更容易地在C和VB.Net之间进行移植,如果您喜欢这类东西的话。

字符串和字符串在所有方面都是相同的,但大写字母S除外。这两种方式都不会影响性能

在大多数项目中,小写字符串是首选的,因为突出显示的语法是System.string的别名。编译器将以相同的方式处理它们

唯一的实际区别是您提到的语法突出显示,如果使用字符串,则必须使用System编写。

String代表System.String,它是一种.NET Framework类型。string是C语言中System.string的别名。它们都被编译成IL中间语言中的System.String,所以并没有区别。选择你喜欢的并使用它。如果你用C编写代码,我更喜欢字符串 因为它是C类型的别名,并且是C程序员所熟知的


关于int、System.Int32等,我可以说是一样的。

两者都是一样的。但从编码指南的角度来看,最好使用字符串而不是字符串。这是开发人员通常使用的。e、 g.我们使用int代替Int32,因为int是Int32的别名

供参考 “关键字字符串只是预定义类System.string的别名。”-C语言规范4.2.3

为了完整起见,这里是大脑中大量的相关信息

正如其他人所指出的,string是System.string的别名。假设您使用字符串的代码编译为System.String,即您没有针对其他具有不同字符串类型的命名空间的using指令,则它们编译为相同的代码,因此在执行时没有任何区别。这只是C中的别名之一。完整列表为:

对象:System.object 字符串:System.string 布尔:系统。布尔 byte:System.byte sbyte:System.sbyte 缩写:System.Int16 ushort:System.UInt16 int:System.Int32 uint:System.UInt32 long:System.Int64 ulong:System.UInt64 浮动:系统。单个 双人:系统,双人 十进制:系统。十进制 char:System.char 除了字符串和对象之外,别名都是值类型。decimal是CLR中的值类型,但不是基元类型。唯一没有别名的基元类型是System.IntPtr

在等级库中,值类型别名称为简单类型。文字可以用于每个简单类型的常量值;没有其他值类型具有可用的文本形式。与VB相比,VB允许DateTime文本,并且也有别名

有一种情况必须使用别名:显式指定枚举的基础类型时。例如:

公共枚举Foo:UInt32{}//无效 公共枚举栏:uint{}//有效 这只是规范定义枚举声明的方式问题——冒号后面的部分必须是整型产品,它是sbyte、byte、short、ushort、int、uint、long、ulong、char的一个标记。。。例如,与变量声明使用的类型生成相反。这并不表示有任何其他区别


最后,当谈到使用哪一种时:我个人在实现中到处使用别名,但在任何API中都使用CLR类型。在实现方面,您使用哪种方法其实并不重要——团队之间的一致性很好,但没有其他人会在意。另一方面,如果在API中引用类型,则以语言中立的方式进行引用是非常重要的。名为ReadInt32的方法是明确的,而名为ReadInt的方法需要解释。例如,调用方可以使用为Int16定义int别名的语言。NET framework设计者遵循了这种模式,在BitConverter、BinaryReader和Convert类中都有很好的例子;但是,不能在反射中使用字符串;您必须使用字符串。

正如其他人所说,它们是相同的。默认情况下,StyleCop规则将强制您使用字符串作为C代码样式的最佳实践,除非引用System.string静态函数,如string.Format、string.Join、string.Concat等。

字符串是保留字,但字符串只是一个类名。 这意味着字符串本身不能用作变量名

如果出于某种原因需要一个名为string的变量,则只能看到这些编译中的第一个:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 
如果确实需要名为string的变量名,可以使用@作为前缀:

StringBuilder @string = new StringBuilder();

另一个关键区别:堆栈溢出以不同的方式突出显示它们

C是一种与CLR一起使用的语言

字符串是C中的一种类型

字符串是CLR中的一种类型

当您将C与CLR字符串一起使用时,该字符串将映射到System.string


理论上,您可以实现生成Java字节码的C编译器。此编译器的合理实现可能会将字符串映射到java.lang.string,以便与java运行时库进行互操作。

我只想将此添加到Ritchers书中的LFOUTS答案中:

C语言规范指出,“就风格而言,使用关键字比 使用完整的系统类型名称。”我不同意语言规范;我更喜欢 使用FCL类型名称并完全避免使用基元类型名称。事实上,我希望如此 编译器甚至没有提供原语类型名称,并迫使开发人员使用FCL 改为键入名称。以下是我的理由:

我看到许多开发人员感到困惑,不知道是否要使用字符串 或者在他们的代码中使用字符串。因为在C字符串中,关键字正好映射到 字符串是FCL类型,没有区别,两者都可以使用。同样地, 我听一些开发者说 应用程序运行时,该int表示32位整数 在32位操作系统上运行,并且当应用程序 正在64位操作系统上运行。这句话是绝对错误的:在C中,int总是映射 ,因此它表示一个32位整数,而与操作系统无关 代码正在上运行。如果程序员在他们的代码中使用Int32,那么 也消除了混淆

在C语言中,long映射到System.Int64,但在另一种编程语言中,long 无法映射到Int16或Int32。事实上,C++/CLI确实将long视为Int32。 用一种语言阅读源代码的人很容易误解代码的含义 如果他或她习惯于使用不同的编程语言进行编程,则表示意图。 事实上,大多数语言甚至不会将long视为关键字,也不会编译代码 那就用它

FCL有许多方法,它们的方法名中包含类型名。对于 例如,BinaryReader类型提供了ReadBoolean、ReadInt32、, 以及System.Convert类型提供的方法,例如 ToBoolean、ToInt32、ToSingle等等。尽管写以下内容是合法的 代码,带float的行对我来说很不自然,而且不明显这行是 正确:

BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good
许多只使用C语言的程序员倾向于忘记其他编程语言 语言可以用来对抗CLR,正因为如此,C-ISM逐渐进入了 类库代码。例如,微软的FCL几乎完全是用C和C语言编写的 FCL团队的开发人员现在已经在库中引入了如下方法 数组的GetLongLength,它返回一个Int64值,该值在C中为long,但在C中不是long 在其他语言中,如C++/CLI。另一个例子是System.Linq.Enumerable的 长计数法


在我读完整段之前,我没有得到他的意见

字符串不是关键字,可以用作标识符,而字符串是关键字,不能用作标识符。从函数的角度来看,两者都是相同的。

与其他程序员的常见做法相反,我更喜欢字符串而不是字符串,只是为了强调一个事实,即字符串是引用类型,正如Jon Skeet所提到的。

字符串是System.String的别名或缩写。这意味着,通过输入string,我们指的是System.string。您可以在think链接中阅读更多内容:

没有区别

C关键字字符串映射到.NET类型System.string-它是一个保持该语言命名约定的别名


类似地,int映射到System.Int32。

String System.String是基类库中的一个类。字符串小写是C中的保留工作,它是System.string的别名。Int32与int的情况与布尔与布尔的情况类似。这些特定于C语言的关键字使您能够以类似于C的方式声明原语。

聚会迟到:我100%的时间都使用CLR类型,除非被迫使用C类型,但我不记得上次是什么时候

根据里奇的CLR书籍,我最初是在几年前开始这样做的。对我来说,所有CLR语言最终都必须能够支持CLR类型集是有道理的,因此自己使用CLR类型可以提供更清晰、可能更可重用的代码

现在我已经做了很多年了,这是一个习惯,我喜欢VS为CLR类型显示的颜色

唯一令人沮丧的是,auto complete使用C类型,因此我最终重新键入自动生成的类型以指定CLR类型


另外,现在,当我看到int或string时,我觉得它真的错了,就像我在看1970年代的C代码一样。

是的,它们之间没有区别,就像布尔和布尔一样。

有一段关于这个问题的引文

所有预定义类型都直接映射到 底层.NET类型。C类型名称字符串只是 .NET类型为String或System.String,因此使用.NET名称在语法上可以很好地工作,尽管 这是令人沮丧的。在C程序中,应该使用C名称 而不是.NET名称

视频实际上展示了它们的不同之处

但现在我们来看看一个很长的文本答案

当我们谈论.NET时,有两种不同的东西,一种是.NET框架,另一种是使用该框架的语言C、VB.NET等

System.String a.k.a字符串大写字母S是.NET framework数据类型,而String是C数据类型

简而言之,String是一个别名,用不同的字符串名称调用相同的东西。因此,从技术上讲,下面两个代码语句将给出相同的输出

String s = "I am String";

同样,其他c数据类型也有别名,如下所示:-

对象:System.object,字符串:System.string,bool:System.Boolean,byte:System.byte,sbyte:System.sbyte,short:System.Int16等等

现在是百万d 从程序员的角度来看,奥利尔的问题是什么时候使用字符串和字符串

避免混淆的第一件事就是要始终如一地使用其中一个。但从最佳实践的角度来看,当您进行变量声明时,最好使用字符串小s,当您将其用作类名时,则首选字符串大写s

在下面的代码中,左侧是一个变量声明,它使用字符串声明。在右边,我们正在调用一个方法,因此字符串更合理

string s = String.ToUpper() ;
字符串是关键字,不能将字符串用作标识符

字符串不是关键字,您可以将其用作标识符:

范例

关键字字符串是的别名 字符串除了关键字问题之外,这两个 相当于

 typeof(string) == typeof(String) == typeof(System.String)

拖延6年5个月后的新答案

虽然string是一个保留的C关键字,总是有固定的含义,但string只是一个普通的标识符,可以引用任何东西。根据当前类型的成员、当前命名空间和applied using指令及其位置,字符串可以是值或不同于global::System.String的类型

我将提供两个使用指令没有帮助的例子

首先,当字符串是当前类型的值或局部变量时:

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}
示例方法中的两条语句都无法编译。这里的弦永远是钢琴,我的钢琴。它不存在静态成员或非格式成员,或从其基类继承。再见的值不能转换成它。

C编译器上的开发人员和多产的SO用户!就这个问题写了一篇文章。我觉得值得在这里分享。这是一个关于我们主题的好视角

字符串与字符串不是风格之争 [……]

关键字字符串在C中有具体的含义。它是存在于核心运行时程序集中的System.string类型。运行时本质上理解这种类型,并提供开发人员在.NET中对字符串所期望的功能。它的存在对于C来说非常关键,如果该类型不存在,编译器将在试图解析一行代码之前退出。因此,字符串在C代码中具有精确、明确的含义

标识符字符串在C中没有具体的含义。它是一个标识符,通过所有的名称查找规则,如Widget、Student等。它可以绑定到字符串,也可以绑定到另一个程序集中的一个类型,其用途可能与字符串完全不同。更糟糕的是,它可能被定义为字符串s=hello这样的代码;继续编译

字符串的实际含义始终取决于名称解析。 这意味着它取决于项目中的所有源文件和所有 在所有引用的程序集中定义的类型。简而言之 需要相当多的上下文才能知道它的意思

的确,在绝大多数情况下,字符串和字符串将绑定到 同样的类型。但使用字符串仍然意味着开发人员正在离开 他们的节目在只有一个节目的地方进行口译 回答正确。当字符串绑定到错误的类型时,它可能会离开 开发人员调试数小时,在编译器团队中归档错误,以及 通常是浪费时间,而使用字符串本可以节省时间

另一种可视化差异的方法是使用此示例:

string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code
许多人会争辩说,虽然这在技术上是准确的,但使用字符串仍然可以,因为很少有代码库会定义这种名称的类型。或者当字符串被定义时,它是坏代码库的标志

[……]

您将看到,String的定义有许多完全有效的用途:反射帮助器、序列化库、lexer、协议等等……对于这些库中的任何一个,String与String的区别取决于代码的使用位置

所以请记住,当你看到字符串与字符串的辩论时,这是关于语义的,而不是样式的。选择字符串可以为代码库提供清晰的含义。选择字符串并没有错,但它为未来的惊喜敞开了大门


注意:出于存档原因,我复制/粘贴了大部分博客文章。我忽略了一些部分,因此如果可以的话,我建议跳过并阅读。

使用字符串时不需要在系统前面加前缀。使用字符串时必须包含使用系统,否则会出现以下错误:找不到类型或命名空间名称“String”是否缺少using指令或程序集引用?如果决定使用StyleCop并遵循该指令,则表示使用特定于该语言的类型。所以对于C,你将使用字符串而不是字符串,int而不是Int32,float而不是Single-我总是使用别名,因为我假设有一天它可能会派上用场,因为它们作为一个抽象,因此,可以在我不知道的情况下更改它们的实现。VisualStudio2015说String.Format应该更改为String.F

ormat,所以我想微软会走这条路。我也经常在静态方法中使用String。你怎么说你可以定义自己的类型“String”,但不能对“String”这样做,因为它是一个关键字,就像在I gues中解释的那样。。。保持冷静。在特定情况下使用string或string或cerntain,但始终在该情况下使用。@O.R.Mapper,但事实仍然是string是C语法的词汇结构,而System.string只是一种类型。不管任何规范中提到的任何显式差异,仍然存在这种隐式差异,可以通过一些模糊性来适应。语言本身必须支持字符串,这种实现方式在BCL .@ KKKWOLL中不太需要考虑一个特定的类:根据语言规范,语言本身必须考虑字符串与BCL类型系统完全相同的字符串。这一点也不含糊。当然,您可以使用C语法实现自己的编译器,并将所有类似的标记用于与C语言规范中定义的内容无关的任意内容。但是,生成的语言只能是C语言,不能将其视为C语言。您可以在不使用系统using指令的情况下使用字符串。对于来自Algol和Fortran的人来说,这个讨论表明字符串有问题。需要缩写System.String,但作为别名,它看起来很像,但不完全相同。在C语言使用了几年之后,我想说,简单地使用string和string.Format是安全的,而不用担心System.string。@Sangeeta你在说什么?String类仍然存在,String关键字仍然是它的别名。就像System.Int32和int一样,它们实际上是一回事。这就是问题所在,它们不是“C”别名,而是“C”别名。C语言中没有本机的“string”或“int”,只有语法糖。不确定C从何而来,因为C 5语言规范读取到,关键字string只是预定义类System.string的别名。第85页第4.2.4段。所有高级语言都比CPU指令集和字节码更适合语法。我个人更喜欢使用Int32,因为它可以立即显示值的范围。想象一下,如果他们在更高位的系统上升级int的类型c中的int显然被视为目标处理器最有效处理的整数类型,定义为至少16位。“我希望在这方面有可预测的一致性,非常感谢。”我同意我的观点。如果说坚持使用.net类型有什么意义的话,那就是因为它们不懂语言,而且类型是显而易见的,与任何语言无关,我知道F或VB的所有特性吗?@nyrguds有两个理由不必担心它。一个是,int在C语言规范中定义为32位整数,与硬件无关。C、 尽管在时间的迷雾中有着共同的传统,但实际上并不是C。将int更改为64位整数将是规范和语言中一个突破性的变化。它还需要重新定义long,因为long当前是64位整数。不必担心的另一个原因与此无关,因为类型永远不会改变,但.NET只是足够抽象,99%的时间你都不必考虑它-@Craig我深入研究了很多旧的专有游戏格式,但我必须一直考虑这些。然后使用Int16、Int32和Int64在代码中比使用非描述性的short、int和long要透明得多。但是short、not、long、float、double等都是描述性的,因为它们在语言规范中。C不是C。我更喜欢在声明中使用它们,因为它们简洁、小,并且美观。我更喜欢API上的Torre库名称,其中API具有数据类型依赖关系。唯一的细微区别是,如果使用String类,则需要在文件顶部导入系统命名空间,而使用String关键字时不必这样做。在一些简单的使用情况下,equality语句会失败。。。例如在blah名称空间中定义一个类型调用字符串,并将该名称空间导入到运行equality语句的文件中。我不理解这个答案的含义,以及为什么它被向上投票。可以在反射中使用typeofstring。示例一:如果someMethodInfo.ReturnType==TypeOfsString{…}示例二:var p=TypeOfsString.GetPropertyFirstChar,BindingFlags.NonPublic | BindingFlags.Instance;在哪里必须使用字符串,而不是字符串?如果尝试Type.GetTypeString或Type.GetTypeString之类的操作,两者都找不到该类,因为缺少命名空间。若出于某些愚蠢的原因,您以区分大小写的方式将类型的.Name与字符串进行比较,那个么您是对的。很高兴在这里找到这个答案。
这是有区别的,这很重要。但现在一行中有两种样式了吗说得好。如果“字符串”不是发明出来的,我们就不会有任何困惑,也不需要这种毫无意义的讨论。我们所有的应用程序都可以用String正常运行如果您不关心位的大小(大多数情况下都是这样),int似乎很有用,而string似乎只是为了一致性而添加的。
string s = String.ToUpper() ;
string String = "I am a string";
 typeof(string) == typeof(String) == typeof(System.String)
class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}
class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}
class TricksterString { 
  void Example() {
    String s = "Hello World"; // Okay but probably not what you expect.
  }
}

class String {
  public static implicit operator String(string s) => null;
}
string s1 = 42; // Errors 100% of the time  
String s2 = 42; // Might error, might not, depends on the code