- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解C#中的string与String由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
目录 。
序 。
字符串是 string 类型的对象,它的值是文本。 在内部,文本被存储为 char 对象的顺序只读集合。 c# 字符串末尾没有以 null 结尾的字符;因此 c# 字符串可以包含任意数目的嵌入式 null 字符(“\0”)。 字符串的 length 属性代表它包含的 char 对象的数量,而不是 unicode 字符的数量。 若要访问字符串中的各个 unicode 码位,请使用 stringinfo 对象.
小写 string 与大写 string 。
在 c# 中,关键字 string 是 string 的别名。 因此,string 与 string 等效,也就是说您想用哪个就用哪个。string 类提供了很多用于安全地创建、操作和比较字符串的方法。此外,c# 语言还重载某些运算符来简化常见的字符串操作.
声明与初始化 string 。
请看示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
static
void
main(
string
[] args)
{
// 声明但不初始化
string
msg1;
// 声明并初始化为 null
string
msg2 =
null
;
// 作为一个空字符串进行初始化,用 empty(空) 常量而不是字面值的 ""(空)
string
msg3 =
string
.empty;
// 用正则的字符串字面值进行初始化
string
oldpath =
"c:\\windows"
;
// 直接以字符串初始化
string
newpath =
@"c:\windows"
;
// 也可以使用 system.string
string
content =
"hello world!"
;
// 使用 const 防止 msg4 被篡改
const
string
msg4 =
"i'm const!"
;
// 可以使用隐式类型 var
var msg5 =
"hi!"
;
// 使用 string 构造器进行初始化
char
[] letters = {
'a'
,
'b'
,
'c'
};
string
alphabet =
new
string
(letters);
console.read();
}
|
【注意】除了在使用字符数组初始化字符串时以外,不要使用 new 运算符创建字符串对象.
使用 empty 常量值初始化字符串可新建字符串长度为零的 string 对象。零长度字符串的字符串表示形式为 ""。使用 empty 值(而不是 null)初始化字符串可以降低发生 nullreferenceexception 的可能性。我们常常会在尝试访问字符串之前使用静态 isnullorempty(string) 方法验证字符串的值.
string 的不可变性 。
字符串对象是不可变的:即它们创建之后就无法更改。 所有看似修改字符串的 string 方法和 c# 中的运算符,实际上都以新字符串对象的形式返回结果。 在下面的示例中,当连接 s1 和 s2 的内容以形成一个字符串时,不会修改两个原始字符串。 += 运算符会创建一个包含组合内容的新字符串。 这个新对象赋给变量 s1,而最初赋给 s1 的对象由于没有其他任何变量包含对它的引用而释放,将在后续被垃圾回收.
示例一:
1
2
3
4
5
6
7
8
9
|
static
void
main(
string
[] args)
{
var s1 =
"hi!"
;
var s2 =
"fanguzai!"
;
//拼接 s1 和 s2,并且修改 s1 指向的值
s1 += s2;
//即 s1 = s1 + s2;
console.writeline(s1);
console.read();
}
|
图:var s1 = "hi!"; var s2 = "fanguzai!",
图:s1 = s1 + s2; 重新修改 s1 的指向 。
由于“修改”字符串实际上是创建一个新字符串,因此创建对字符串的引用时必须谨慎。 如果创建了对字符串的引用,然后“修改”原始字符串,则该引用指向的仍是原始对象,而不是修改字符串时创建的新对象.
1
2
3
4
5
6
7
8
9
|
static
void
main(
string
[] args)
{
var s1 =
"hi! "
;
var s2 = s1;
//在 s1 重新赋值后,这次没有重新修改 s2 指向的值
s1 +=
"fanguzai!"
;
//即 s1 = s1 + "fanguzai!";
console.writeline(s2);
console.read();
}
|
图:var s1 = "hi!"; s2 = s1; 他们指向相同的引用地址 。
图:s1 = s1 + "fanguzai!"; 会创建一个没有引用的 "fanguzai!",并重新修改 s1 指向的值.
正则 string 与原义 string 。
如果必须嵌入 c# 提供的转义符,则应使用正则字符串
1
2
3
4
5
6
7
8
9
10
|
static
void
main(
string
[] args)
{
var colustring =
"col1\tcol2\tcol3"
;
var rowstring =
"row1\r\nrow2\r\nrow3"
;
console.writeline(colustring);
console.writeline(
"====="
);
console.writeline(rowstring);
console.read();
}
|
如果字符串文本包含反斜杠字符(例如在文件路径中),为方便起见和提高可读性,应使用原义字符串。由于原义字符串保留换行符作为字符串文本的一部分,因此可用于初始化多行字符串。在原义字符串中嵌入引号时请使用双引号。下面的示例演示原义字符串的一些常见用途:
1
2
3
4
5
6
7
8
9
10
11
|
static
void
main(
string
[] args)
{
var path =
@"c:\windows"
;
var text =
@"are you fanguzai?
i'm fanguzai!"
;
console.writeline(path);
console.writeline(
"====="
);
console.writeline(text);
console.read();
}
|
string 的转义序列 。
【备注】编译时,原义字符串转换为所有转义序列均保持不变的普通字符串。因而,如果在调试器监视窗口中查看原义字符串,则看到的将是编译器添加的转义字符,而不是源代码中的原义版本。 例如,原义字符串 @"c:\temp.txt" 在监视窗口中将显示为 "c:\\temp.txt".
格式化字符串 。
格式字符串是内容可以在运行时动态确定的一种字符串。采用以下方式创建格式字符串:使用静态 format 方法并在大括号中嵌入占位符,这些占位符将在运行时替换为其他值.
1
2
3
4
5
6
7
8
|
private
static
void
main(
string
[] args)
{
const
string
name =
"fanguzai"
;
var s =
string
.format(
"hi, {0}!"
, name);
//使用占位符
console.writeline(s);
console.read();
}
|
操作子字符串 。
子字符串是包含在字符串中的任意字符序列。 使用 substring 方法可以基于原始字符串的一部分创建新字符串。 可以使用 indexof 方法搜索子字符串的一个或多个匹配项。 使用 replace 方法可将指定子字符串的所有匹配项替换为一个新字符串。 与 substring 方法一样,replace 实际上返回的也是新字符串,而不修改原始字符串.
1
2
3
4
5
6
7
8
|
private
static
void
main(
string
[] args)
{
const
string
s1 =
"hi, fanguzai!"
;
console.writeline(s1.substring(4));
//截取
console.writeline(s1.replace(
"hi"
,
"hello"
));
//替换
console.writeline(s1.indexof(
","
, stringcomparison.ordinal));
//取索引
console.read();
}
|
字符串的 null 与 ""(空) 。
空字符串是不包含字符的 system.string 对象的实例。 在各种编程方案中经常会使用空字符串表示空白文本字段。 可以对空字符串调用方法,因为它们是有效的 system.string 对象.
var s = string.empty,
相反,null 字符串并不引用 system.string 对象的实例,任何对 null 字符串调用方法的尝试都会生成 nullreferenceexception。 但是,可以在串联和比较操作中将 null 字符串与其他字符串一起使用.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private
static
void
main(
string
[] args)
{
const
string
s1 =
"hi, fanguzai!"
;
string
s2 =
null
;
var s3 =
string
.empty;
var s4 = s1 + s2;
//有值的字符串与 null 拼接
console.writeline(
"s4: {0}"
, s4);
console.writeline(
""
);
var istrue = (s2 == s3);
console.writeline(
"istrue: {0}"
, istrue);
console.writeline();
var s5 = s3 + s2;
console.writeline(
"s5: {0}"
, s5);
console.writeline();
console.read();
}
|
可提高性能的 stringbuilder 。
.net 中的字符串操作已高度优化,大多数情况下不会显著影响性能。但在某些应用场景中,例如在执行数百甚至好几亿次的循环中,字符串操作很可能会影响性能。 stringbuilder 类创建了一个字符串缓冲区,用于在程序执行大量字符串操作时提供更好的性能。 stringbuilder 字符串可以重新分配个别字符(内置字符串数据类型所不支持的字符)。例如,此代码在不创建新字符串的情况下更改了一个字符串的内容:
1
2
3
4
5
6
7
|
static
void
main(
string
[] args)
{
var sb =
new
stringbuilder(
"~ hi! fanguzai!"
);
sb[0] =
'^'
;
console.writeline(sb);
console.read();
}
|
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我! 。
原文链接:http://www.cnblogs.com/liqingwen/p/6155790.html 。
最后此篇关于详解C#中的string与String的文章就讲到这里了,如果你想了解更多关于详解C#中的string与String的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!