小编Hos*_*Aly的帖子

为什么在.NET中复制字符串?

由于字符串在.NET中是不可变的,为什么它们被复制用于简单的操作,如SubstringSplit?例如,通过保持char[] value,int start并且int length,一个串可以创建简单地指向一个现有的字符串,我们可以节省复制了许多简单的操作字符串的开销.所以我想知道,为什么选择复制字符串进行此类操作?

例如,这样做是为了支持当前的实施StringBuilder吗?或者char[]当只需要几个字符时,为了避免保留对大的引用?或者你能想到的任何其他原因?你能为这种设计提出利弊吗?

正如@cletus所提到并得到@Jon Skeet的支持,这更像是在问这个方面为什么.NET字符串与Java不同.

.net string

4
推荐指数
2
解决办法
365
查看次数

阻止版本的System.IO.Stream.Read(byte [],int,int)

我正在使用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)

.net c#

3
推荐指数
1
解决办法
4346
查看次数

这些代码示例中的哪一个具有更好的性能?

在回答我的一个问题时,我收到了一些答案,说样式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)

c# performance

3
推荐指数
1
解决办法
627
查看次数

为什么.NET的条件属性导致副作用被删除?

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删除了?这对我没有任何意义!

.net conditional

3
推荐指数
2
解决办法
621
查看次数

将Thread.VolatileWrite()与数组参数一起使用

我想使用Thread.VolatileWrite()(或等效函数)来更改T[]字段的值,以便更新的值立即对所有其他线程可见.但是,该方法不提供通用版本,并且我无法使用Object重载,因为它需要一个ref参数.

还有其他选择吗?会Interlocked.Exchange<T>做这个工作吗?有没有更好的方法来实现我想做的事情?

.net multithreading

3
推荐指数
1
解决办法
343
查看次数

在try/finally外部或内部初始化一次性资源

我已经看到了两种获取和处理资源的方法.或者:

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块之前处理线程中止的情况.这些风格有什么其他优点和缺点?我最好使用哪一个?

c# java resources coding-style

3
推荐指数
1
解决办法
2263
查看次数

动态/条件SQL加入?

我在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)

我想知道是否有办法做到这一点..或者更好的方式我不想考虑这个...

sql sql-server join

3
推荐指数
2
解决办法
2万
查看次数

我可以使用LINQ更优雅地重写它吗?

我有一个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编写这个?

(我知道,可以使用临时变量来使这看起来更好,但这种代码格式更好地传达了我正在寻找的东西.)

c# linq linq-to-objects

3
推荐指数
1
解决办法
1178
查看次数

Seam项目的推荐源代码控制忽略模式是什么?

使用生成项目后seam-gen,源控件的推荐忽略模式是什么?推荐的.gitignore文件(svn:ignore或等价物)应该是什么样的?

svn git mercurial jboss seam

3
推荐指数
1
解决办法
242
查看次数

Scala减少返回不同的数据类型

我从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)
found   : (String, String) => Int  
required: (Any, Any) => Any
Run Code Online (Sandbox Code Playgroud)

即使我改变它,添加一个显式转换为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)

不起作用.

这样做的正确方法是什么?我做错了什么?

scala

3
推荐指数
2
解决办法
830
查看次数