小编n53*_*535的帖子

C#中的字符串不变性

我很好奇StringBuilder类是如何在内部实现的,因此我决定查看Mono的源代码并将其与Reflector的反汇编代码进行比较.从本质上讲,Microsoft的实现用于char[]在内部存储字符串表示,以及一些不安全的方法来操作它.这很简单,没有提出任何问题.但当我发现Mono在StringBuilder中使用一个字符串时,我很困惑:

private int _length;
private string _str;
Run Code Online (Sandbox Code Playgroud)

第一个想法是:"多么无谓的StringBuilder".但后来我发现可以使用指针改变字符串:

public StringBuilder Append (string value) 
{
     // ...
     String.CharCopy (_str, _length, value, 0, value.Length);
}

internal static unsafe void CharCopy (char *dest, char *src, int count) 
{
    // ...
    ((short*)dest) [0] = ((short*)src) [0]; dest++; src++;
}    
Run Code Online (Sandbox Code Playgroud)

我曾经在C/C++中编程一点,所以我不能说这段代码让我很困惑,但我认为字符串是完全不可变的(即绝对没有办法改变它).所以实际的问题是:

  • 我可以创建一个完全不可变的类型吗?
  • 除性能问题外,是否有任何理由使用此类代码?(更改不可变类型的不安全代码)
  • 字符串本质上是线程安全的吗?

.net c# pointers immutability

25
推荐指数
1
解决办法
2496
查看次数

关于Nullable <T>约束的困惑

向大家致以问候.对不起,如果以前已经问过这个问题(徒劳无功),或者说非常简单,但我无法得到它.Nullable类型的MSDN定义声明它是以下列方式定义的:

[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()
Run Code Online (Sandbox Code Playgroud)

所以问题非常简单:这个定义怎么可能?或者这只是一个错字?每个值类型都有一个默认构造函数.实际上,当我尝试编译这样的东西时,编译器合理地说,同时应用两个约束是非法的,因为第二个隐含地包含在第一个约束中.

提前致谢.

.net c# nullable

10
推荐指数
2
解决办法
357
查看次数

编程语言中的字节序

嗯,"Endianness"主题对我来说总是有点混乱,但我从来没有遇到任何问题,这些问题要求我甚至考虑我使用的二进制编写器/阅读器的默认行为.我正在c#中写一个PNG解码器.PNG文件格式规范声明所有数字都以大端符号存储(我觉得非常自然).但是,当我注意到.NET的BinaryReader/Writer使用一点endian符号时,我感到非常惊讶.令我更加困惑的是,事实上,java的二进制IO与大端符号一起工作(不是java程序员,所以也许我错了).所以我开始考虑以下问题:

1 - 为什么它们是这样的?我的意思是基类库的默认行为.2 - 为什么在使用.NET的System.IO时无法选择首选符号?

我目前正在使用Jon Skeet的 MiscUtil,它就像一个魅力(感谢,man =)).但是在基类库中看到这个功能会很酷.

.net c# java endianness

6
推荐指数
1
解决办法
2279
查看次数

在dotnet中查找缓慢/无效的方法调用

我在一些遗留代码中遇到了一大堆旧的方法调用,其中一个或一些正在制造瓶颈并且确实减慢了速度.有没有快速的方法我可以获得一个报告,说明哪些方法调用花费时间,没有在调试中运行,单步执行并查看光标暂停的位置?

.net

5
推荐指数
2
解决办法
343
查看次数

标签 统计

.net ×4

c# ×3

endianness ×1

immutability ×1

java ×1

nullable ×1

pointers ×1