作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这篇文章并不是关于下面代码中的错误,我自己可以想象出几十种解决它的方法,它主要与简单、优雅和性能有关!
我必须做一个非常简单的文本解析器,类似这样:
string ParseWord(ref string Line, ref int Pos) {
// Inspect Line from Pos, increment Pos and return next Word
}
void ParseText(string[] Lines) {
foreach (string Line in Lines) {
int Pos = 0;
string Word;
while ((Word = ParseWord(ref Line, ref Pos)) != null) {
// Do something with Word
}
}
}
不幸的是,它不能那样工作,因为“foreach”变量“Line”是通过引用传递的,这是不允许的。
您现在可能已经注意到,我通常是一名 C++ 程序员。我的想法是将字符串作为引用传递会更快,因为不必每次都复制它。
第一个问题:该假设在 C# 中是否仍然有效?
第二个问题:如何传递对“Line”的引用并仍然使用“foreach”——C# 中没有“const”
第三个问题:我是不是在想一些不合适的 C++ 方式以及类似的东西我们在 C# 中会做不同的事情吗?
最佳答案
不,这不是一个有效的假设。默认情况下,C# 通过引用传递字符串,这意味着在幕后有效传递指针。
使用ref
或out
传递字符串的唯一原因是被调用的方法需要修改字符串并且该修改需要反射(reflect)在调用方法中.因为字符串是不可变的,在目标方法中“改变”字符串实际上是创建了一个新的字符串,不会影响原来传递的字符串。在这种情况下,使用 ref
或 out
将导致调用方法中的指针更新为指向新的修改后的字符串。
如果您不更改字符串,则只需正常传递字符串即可,效率非常高。我会推荐诸如 C# Concepts: Value vs Reference Types 之类的文章.
关于c# - 如何将常量字符串引用传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14131435/
我是一名优秀的程序员,十分优秀!