c# char转string c语言char - C#中字符串和字符串有什么区别?





15 Answers

仅仅为了完整起见,这里是相关信息的大脑转储......

正如其他人所说, stringSystem.String的别名。 它们编译为相同的代码,因此在执行时没有任何区别。 这只是C#中的别名之一。 完整清单是:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

除了stringobject ,别名都是值类型。 decimal是值类型,但不是CLR中的基本类型。 唯一没有别名的原始类型是System.IntPtr

在规范中,值类型别名称为“简单类型”。 文字可用于每种简单类型的常量值; 没有其他值类型具有可用的文字形式。 (将其与允许DateTime文字的VB进行比较,并且也具有别名。)

在某种情况下,您必须使用别名:明确指定枚举的基础类型时。 例如:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

这只是规范定义枚举声明的方式问题 - 冒号之后的部分必须是整数型生成,这是sbytebyteshortushortintuintlongulongchar一个标记。 ..而不是例如变量声明所使用的类型生产。 它并不表示任何其他差异。

最后,当谈到使用它时:我个人在各处使用别名来实现,但是任何API都使用CLR类型。 你在实施方面使用它并不重要 - 你的团队之间的一致性很好,但没有人会关心。 另一方面,如果您在API中引用类型,则以语言中立的方式执行此操作,这一点非常重要。 名为ReadInt32的方法是明确的,而名为ReadInt的方法需要解释。 例如,调用者可能正在使用为Int16定义int别名的语言。 .NET框架设计者已经遵循这种模式,在BitConverterBinaryReaderConvert类中有很好的例子。

c++ char数组转string c++遍历字符串

示例( 注意案例 ):

string s = "Hello world!";
String s = "Hello world!";

使用每种方法的准则是什么? 有什么区别




我听说过在C#中使用提供的类型别名的最佳答案来自Jeffrey Richter在他的书CLR Via C#中 。 以下是他的3个理由:

  • 我见过许多开发人员感到困惑,不知道是否在代码中使用字符串字符串 。 因为在C#中,字符串(关键字)完全映射到System.String(一种FCL类型),所以没有区别,可以使用它们。
  • 在C#中, 映射到System.Int64 ,但是在不同的编程语言中, long可以映射到Int16Int32 。 事实上,C ++ / CLI确实将long视为Int32 。 如果某人使用一种语言阅读源代码,如果他或她习惯于使用不同的编程语言进行编程,则很容易误解代码的意图。 实际上,大多数语言甚至不会将long视为关键字,也不会编译使用它的代码。
  • FCL有许多方法,它们将类型名称作为其方法名称的一部分。 例如, BinaryReader类型提供诸如ReadBooleanReadInt32ReadSingle等方法,而System.Convert类型提供诸如ToBooleanToInt32ToSingle等方法。 虽然编写下面的代码是合法的,但浮点线对我来说感觉非常不自然,并且线条不正确并不明显:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

所以你有它。 我认为这些都非常好。 但是,我发现自己在自己的代码中没有使用Jeffrey的建议。 也许我太困在我的C#世界,但我最终试图使我的代码看起来像框架代码。




有一个区别 - 你不能在不使用using System;情况下使用String using System; 预先。




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

至于指导方针,我不会陷入困境,只是使用你想要的任何东西 - 生活中有更重要的事情,无论如何代码都是一样的。

如果你发现你自己构建系统,你需要指定你正在使用的整数的大小,因此倾向于使用Int16Int32UInt16UInt32等,那么使用String可能看起来更自然 - 并且当它们在不同之间移动时.net语言可能会使事情更容易理解 - 否则我会使用string和int。




stringString在所有方面都相同(大写“S”除外)。 无论如何都没有性能影响。

由于语法高亮,大多数项目中首选小写string




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

但现在需要很长的文字答案。

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

System.String ”又名“String”(大写“S”)是.NET框架数据类型,而“string”是C#数据类型。

简而言之,“String”是“string”的别名(使用不同的名称调用相同的东西)。 因此从技术上讲,下面的代码语句都会提供相同的输出。

String s = "I am String";

要么

string s = "I am String";

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

object: System.Object ,string: System.String ,bool: System.Boolean ,byte: System.Byte ,sbyte: System.SByte ,short: System.Int16等等

现在从程序员的角度来看百万美元的问题那么何时使用“String”和“string”?

避免混淆的第一件事是始终如一地使用其中一个。 但是从最佳实践角度来看,当你进行变量声明时,最好使用“string”(小“s”),当你使用它作为类名时,首选“String”(大写“S”)。

在下面的代码中,左侧是变量声明,它使用“string”声明。 在右侧,我们调用一种方法,因此“字符串”更明智。

string s = String.ToUpper() ;



小写stringSystem.String的别名。 它们在C#中是相同的。

关于是否应该使用系统类型( System.Int32System.String等)类型或C# aliasesintstring等)存在争议。 我个人认为你应该使用C# aliases ,但这只是我个人的偏好。




正如其他人所说,他们是一样的。 默认情况下,StyleCop规则将强制您使用string作为C#代码样式的最佳实践,除非引用System.String静态函数,例如String.FormatString.JoinString.Concat等...




对于其他程序员似乎常见的做法,我更喜欢String over string ,只是为了强调String是一个引用类型,正如Jon Skeet所提到的那样。




String( System.String )是基类库中的一个类。 string(小写)是C#中的保留工作,它是System.String的别名。 Int32 vs int与Boolean vs. bool类似。 这些特定于C#语言的关键字使您能够以类似于C的样式声明基元。




聚会迟到:我100%使用CLR类型(好吧,除非被迫使用C#类型,但我不记得最后一次是什么时候)。

根据Ritchie的CLR书籍,我最初几年前开始做这件事。 我认为所有CLR语言最终都必须能够支持CLR类型集合,因此使用CLR类型本身提供了更清晰,可能更“可重用”的代码。

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

唯一真正的失败是自动完成使用C#类型,所以我最终重新键入自动生成的类型来指定CLR类型。

而且,现在,当我看到“int”或“string”时,我看起来真的不对,就像我在看1970年的C代码一样。




真的,这是一个惯例问题。 string看起来更像是C / C ++风格。 一般惯例是使用您选择的语言提供的任何快捷方式( Int32 int / Int)。 这也适用于“对象”和decimal

从理论上讲,这可能有助于将代码移植到未来的64位标准中,其中“int”可能意味着Int64 ,但这不是重点,我希望任何升级向导都能更改对Int32任何int引用,只是为了安全起见。




6年零5个月后的新答案(拖延)。

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

我将提供两个using指令无效的例子。

首先,当String是一个的当前类型(或局部变量)的:

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

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

以上将不会编译,因为IEnumerable<>没有调用非静态成员Format,并且不应用扩展方法。在上述情况下,仍然可以String在其他上下文中使用,其中类型是语法上唯一的可能性。例如,String local = "Hi mum!";可以是OK(取决于命名空间和using指令)。

更糟糕的是:说String.Concat(someSequence)可能(取决于usings)转到Linq扩展方法Enumerable.Concat。它不会转到静态方法string.Concat

其次,当String是另一种类型时,嵌套在当前类型中:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Example方法中的任何一个语句都没有编译。这String始终是一个钢琴stringMyPiano.String。没有成员(static或不Format存在)(或从其基类继承)。而且价值"Goodbye"无法转化为它。




string是关键字,您不能使用string作为标识符。

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

string String = "I am a string";

除关键字问题外,关键字string是别名System.String,两者完全等效。

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



两者之间没有区别 - string但是,在考虑其他开发人员的源代码时,似乎是首选方案。






Related