由于字符串在.NET中是不可变的,为什么它们被复制用于简单的操作,如Substring或Split?例如,通过保持char[] value,int start并且int length,一个串可以创建简单地指向一个现有的字符串,我们可以节省复制了许多简单的操作字符串的开销.所以我想知道,为什么选择复制字符串进行此类操作?
例如,这样做是为了支持当前的实施StringBuilder吗?或者char[]当只需要几个字符时,为了避免保留对大的引用?或者你能想到的任何其他原因?你能为这种设计提出利弊吗?
正如@cletus所提到并得到@Jon Skeet的支持,这更像是在问这个方面为什么.NET字符串与Java不同.
我正在使用System.IO.Stream.Read(byte[] buffer, int offset, int count).是否有替代该方法(或要设置的属性),以便在读取所有计数(或达到流的末尾)之前该方法不会返回?或者我应该做这样的事情:
int n = 0, readCount = 0;
while ((n = myStream.Read(buffer, readCount, countToRead - readCount)) > 0)
readCount += n;
Run Code Online (Sandbox Code Playgroud) 在回答我的一个问题时,我收到了一些答案,说样式2可能比样式1表现更好.我不明白如何,因为我认为它们应该发出基本相同的机器指令(如果用C++编写).你能解释为什么风格2可能表现更好吗?
我将在这里重写这两种样式以便于参考:
风格1:
while (!String.IsNullOrEmpty(msg = reader.readMsg()))
{
RaiseMessageReceived();
if (parseMsg)
{
ParsedMsg parsedMsg = parser.parseMsg(msg);
RaiseMessageParsed();
if (processMsg)
{
process(parsedMsg);
RaiseMessageProcessed();
}
}
}
Run Code Online (Sandbox Code Playgroud)
风格2:
while (!String.IsNullOrEmpty(msg = reader.readMsg()))
{
RaiseMessageReceived();
if (!parseMsg) continue;
ParsedMsg parsedMsg = parser.parseMsg(msg);
RaiseMessageParsed();
if (!processMsg) continue;
process(parsedMsg);
RaiseMessageProcessed();
}
Run Code Online (Sandbox Code Playgroud) 我Conditional今天读到了这个属性.根据MSDN:
应用于
ConditionalAttribute方法指示编译器不应将对方法的调用编译为Microsoft中间语言(MSIL),除非ConditionalAttribute定义了与之关联的条件编译符号.
好.这很清楚.因此不会编译对该方法的调用.但副作用呢?
[Conditional("UndefinedCondition")]
static void f1(int x) { Console.WriteLine(x); }
static int a = 0;
static void f2() { f1(++a); }
Run Code Online (Sandbox Code Playgroud)
因此,当f2被调用时,f1应该删除调用.但为什么也被++a删除了?这对我没有任何意义!
我想使用Thread.VolatileWrite()(或等效函数)来更改T[]字段的值,以便更新的值立即对所有其他线程可见.但是,该方法不提供通用版本,并且我无法使用Object重载,因为它需要一个ref参数.
还有其他选择吗?会Interlocked.Exchange<T>做这个工作吗?有没有更好的方法来实现我想做的事情?
我已经看到了两种获取和处理资源的方法.或者:
Resource resource = getResource();
try { /* do something with resource */ }
finally { resource.close(); }
Run Code Online (Sandbox Code Playgroud)
要么:
Resource resource = null;
try { resource = getResource(); /* do something with resource */ }
finally { if (resource != null) resource.close(); }
Run Code Online (Sandbox Code Playgroud)
我想知道哪种风格更可取.第一个避免if条件,而第二个(我假设)在赋值之后但在进入try块之前处理线程中止的情况.这些风格有什么其他优点和缺点?我最好使用哪一个?
我在MSSQL表(TableB)中有数据,其中[dbo] .tableB.myColumn在特定日期之后更改格式...
我正在做一个简单的加入那张桌子..
Select [dbo].tableB.theColumnINeed from [dbo].tableA
left outer join [dbo].tableB on [dbo].tableA.myColumn = [dbo].tableB.myColumn
Run Code Online (Sandbox Code Playgroud)
但是,我需要使用不同的格式加入,基于表A中的日期列([dbo] .tableA.myDateColumn).
就像是...
Select [dbo].tableB.theColumnINeed from [dbo].tableA
left outer join [dbo].tableB on [dbo].tableA.myColumn =
IF [dbo].tableA.myDateColumn > '1/1/2009'
BEGIN
FormatColumnOneWay([dbo].tableB.myColumn)
END
ELSE
BEGIN
FormatColumnAnotherWay([dbo].tableB.myColumn)
END
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法做到这一点..或者更好的方式我不想考虑这个...
我有一个double[][]我想要转换为CSV字符串格式(即一行中的每一行,以逗号分隔的行元素).我这样写的:
public static string ToCSV(double[][] array)
{
return String.Join(Environment.NewLine,
Array.ConvertAll(array,
row => String.Join(",",
Array.ConvertAll(row, x => x.ToString())));
}
Run Code Online (Sandbox Code Playgroud)
有没有更优雅的方式来使用LINQ编写这个?
(我知道,可以使用临时变量来使这看起来更好,但这种代码格式更好地传达了我正在寻找的东西.)
使用生成项目后seam-gen,源控件的推荐忽略模式是什么?推荐的.gitignore文件(svn:ignore或等价物)应该是什么样的?
我从Java开始Scala,
此刻,我正在尝试解决简单的算法,基本上,在两hh:mm分钟之间进行转换以尝试尽可能多的scala功能.我的代码现在就是这个(它有效)
def hourToMins(time : String):String =
time.split(':').reduce(((a:String, b: String)=> a.toInt * 60 + b.toInt + ""))
Run Code Online (Sandbox Code Playgroud)
但是,如果我+ ""在最后删除并且还将函数的返回类型更改为Int,则不起作用
def hourToMins(time : String):Int=
time.split(':').reduce(((a:String, b: String)=> a.toInt * 60 + b.toInt ))
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)found : (String, String) => Int required: (Any, Any) => Any
即使我改变它,添加一个显式转换为Int喜欢
def hourToMins(time : String):Int=
time.split(':').reduce(((a:String, b: String)=> (a.toInt * 60 + b.toInt ).toInt)
Run Code Online (Sandbox Code Playgroud)
看来这个版本也期望这两个参数是Int :(
def hourToMins(time : String):Int=
time.split(':').reduce[Int](((a:String, b: String)=> a.toInt * 60 + b.toInt ))
Run Code Online (Sandbox Code Playgroud)
不起作用.
这样做的正确方法是什么?我做错了什么?
.net ×4
c# ×4
coding-style ×1
conditional ×1
git ×1
java ×1
jboss ×1
join ×1
linq ×1
mercurial ×1
performance ×1
resources ×1
scala ×1
seam ×1
sql ×1
sql-server ×1
string ×1
svn ×1