众所周知,String是不可变的.String不可变的原因是什么,StringBuilder类的引入是可变的?
StringBuilder类是如何实现的?每次追加时它是否在内部创建新的字符串对象?
请帮助我们解决"几乎"的争议一切都是一个对象(Stack Overflow问题的答案作为一个新手,在学习C#之前有什么我应该注意的吗?).我认为就是这种情况,因为Visual Studio中的所有内容至少都显示为结构体.请张贴参考文献,以免它变成"现代傻瓜"(This American Life).
请注意,这个问题涉及C#,不一定是.NET,以及它如何处理引擎盖下的数据(显然它都是1和0).
以下是"一切都是对象"的评论:
对象的定义:"对象"作为类System.Object的继承者与"对象"作为类型与"对象"作为引用类型的实例."
我在网站上找到了如下代码.
string a = "xx";
string b = "xx";
string c = "x";
string d = String.Intern(c + c);
Console.WriteLine((object)a == (object)b); // True
Console.WriteLine((object)a == (object)d); // True
Run Code Online (Sandbox Code Playgroud)
在这里,再次投射到对象类型的目的是什么,因为a,b,d本身就是字符串的对象?
可能重复:
String vs StringBuilder
我刚刚重温了一些我曾经拿过VB.NET的书.我不确定我是否已经掌握了这一点,了解StringBuilder是如何/是什么.
使用指南是什么?如果要连接2个字符串或50个字符串,最好使用它吗?
或者当总字符串长度大于128个字符时?
或者,只要您使用它来将字符串添加到一起,您会看到性能优势吗?
在哪种情况下,最好使用StringBuilder实例来构建SQL语句string.format("Select * from x where y = {0}",1)?
总是让我感到震惊的是,声明另一个变量并包含名称空间对小字符串连接不利,但我现在不确定.
对不起,很多文档告诉你要使用什么,而不是什么是最好的.
这是我上一次采访的方式:
问题:字符串存储在哪里?
答:堆是因为它是参考类型
问题:请解释以下代码:
static void Main(string[] args)
{
string one = "test";
string two = one;
one = one + " string";
Console.WriteLine("One is {0}" , one);
Console.WriteLine("Two is {0}", two);
}
Run Code Online (Sandbox Code Playgroud)
答案:画了两张如下图:
(代表声明, string two = one;

(代表语句, one = one + " string";.在堆上创建一个新字符串并分配)

问题:正确.为下面的代码片段绘制类似的内容:
class Program
{
static void Main(string[] args)
{
Test one = new Test { someString = "test" };
Test two = one;
one.someString = "test String";
Console.WriteLine("One …Run Code Online (Sandbox Code Playgroud) 我正在阅读 Joseph Albahari 的书“C# 10 in a Nutshell”,它谈到“匿名类型的非描述性突变”,但我什至不知道突变是什么,在谷歌上我能找到的只是“突变测试”或“什么是突变”非破坏性突变?” 它们总是作为记录类型的附带功能而结束。有人可以帮我分解一下吗?一些例子将不胜感激!
我来了(根据我)C#中的结构和接口之间的奇怪区别.考虑这个接口和结构:
public interface INumber
{
void ChangeNumber(int n);
void Log();
}
public struct Number : INumber
{
private int n;
public void ChangeNumber(int n)
{
this.n = n;
}
public void Log()
{
Console.WriteLine(this.n);
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个具有Number作为属性的新类时,使用ChangeNumber方法将n更改为2并使用Log打印该数字,它将打印0:
public class NumberContainer
{
public Number Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 0...
}
}
Run Code Online (Sandbox Code Playgroud)
过了一会儿,我意识到这是因为当我调用时this.Number.ChangeNumber(2);,我实际创建了一个新对象(因为getter)并将该数字更改为2.但后来我通过将Number属性更改为INumber属性来更改了一些代码:
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = …Run Code Online (Sandbox Code Playgroud) 此代码是否采用x并直接更改其内容或创建临时新字符串然后复制到x?
如果后者是真的,我不明白为什么我们使用ref.
public static void RemoveSpaces(ref string x)
{
x = x.Replace(" ", "");
}
Run Code Online (Sandbox Code Playgroud)