我想知道以下代码是如何优化的.特别涉及虚拟和直接呼叫.我评论过我认为一切都是优化的,但这些只是猜测.
public abstract class Super
{
public abstract void Foo();
public void FooUser()
{
Foo();
}
}
public class Child1 : Super
{
public override void Foo()
{
//doSomething
}
}
public class SealedChild : Super
{
public override void Foo()
{
//doSomething
}
}
class Program
{
void main()
{
Child1 child1 = new Child1();
child1.Foo(); //Virtual call?
child1.FooUser(); //Direct call and then a virtual call.
SealedChild sealedChild = new SealedChild();
sealedChild.Foo(); //Direct call?
sealedChild.FooUser();
/* Two options: either …Run Code Online (Sandbox Code Playgroud) 编辑:示例很糟糕,导致与问题无关的答案.给定一个大的选择查询,在一个简单的程序,如:
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet srs = stmt.executeQuery(
"SELECT AGE FROM USERS");
while (srs.next()) {
ageStdDevAccumulator += Math.Pow(averageAge - srs.getInt("AGE"),2);
}
int ageStdDev= Math.Sqrt(ageStdDevAccumulator / userCount);
Run Code Online (Sandbox Code Playgroud)
我知道一旦运行了executeQuery,那么整个用户年龄列就会从数据库发送到程序.是对的吗?如果数据库中有太多用户,这是否会导致服务器上的内存溢出?如果是这样,那么可以将选择查询分解为更小的块?如果是这样,有可能让编译器自己解决这个问题吗?
谢谢,一个数据库noob程序员.
我想写的是以下内容:
async void Foo()
{
var result = await GetMyTask().IgnoreCancelAndFailure();
ProcessResult(result);
}
Run Code Online (Sandbox Code Playgroud)
代替:
void Foo()
{
GetMyTask().ContinueWith(task => ProcessResult(task.Result),
TaskContinuationOptions.OnlyOnRanToCompletion);
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何实现IgnoreCancelAndFailure方法,它具有以下签名:
//On cancel or failure this task should simply stop and never complete.
Task<T> IgnoreCancelAndFailure<T>(this Task<T> task)
{
throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)
如果可能,我应该如何实现IgnoreCancelAndFailure?