在阅读C#代码时,我发现了一个相当好奇的片段:
if( whatever is IDisposable) {
(whatever as IDisposable).Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我宁愿期待这样做:
if( whatever is IDisposable) { //check
((IDisposable)whatever).Dispose(); //cast - won't fail
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
IDisposable whateverDisposable = whatever as IDisposable;
if( whateverDisposable != null ) {
whateverDisposable.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
我的意思as是像演员,但null失败的回报.在第二个片段中,它不会失败(因为is之前有一个检查).
在第一个代码片段中编写代码而不是在第二个或第三个代码中编写代码有什么意义?
如何从单元内测试中获取单元测试名称?
我在BaseTestFixture类中有以下方法:
public string GetCallerMethodName()
{
var stackTrace = new StackTrace();
StackFrame stackFrame = stackTrace.GetFrame(1);
MethodBase methodBase = stackFrame.GetMethod();
return methodBase.Name;
}
Run Code Online (Sandbox Code Playgroud)
我的Test Fixture类继承自基类:
[TestFixture]
public class WhenRegisteringUser : BaseTestFixture
{
}
Run Code Online (Sandbox Code Playgroud)
我有以下系统测试:
[Test]
public void ShouldRegisterThenVerifyEmailThenSignInSuccessfully_WithValidUsersAndSites()
{
string testMethodName = this.GetCallerMethodName();
//
}
Run Code Online (Sandbox Code Playgroud)
当我从Visual Studio中运行它时,它会按预期返回我的测试方法名称.
当由TeamCity运行时,_InvokeMethodFast()将返回,这似乎是TeamCity在运行时为自己使用而生成的方法.
那么我怎样才能在运行时获得测试方法名称?
有时需要禁止C++类中的复制构造函数,以使类变为"不可复制".当然,operator=应该同时禁止.
到目前为止,我已经看到了两种方法.方法1是将方法声明为private并且不给它实现:
class Class {
//useful stuff, then
private:
Class( const Class& ); //not implemented anywhere
void operator=( const Class& ); //not implemented anywhere
};
Run Code Online (Sandbox Code Playgroud)
方法2是将方法声明为private并将其赋予"空"实现:
class Class {
//useful stuff, then
private:
Class( const Class& ) {}
void operator=( const Class& ) {}
};
Run Code Online (Sandbox Code Playgroud)
IMO第一个更好 - 即使有一些意外的原因导致从同一个类成员函数调用复制构造函数,稍后会出现链接器错误.在第二种情况下,在运行时之前不会注意到这种情况.
第一种方法有任何严重的缺点吗?什么是更好的方式,如果有的,为什么?
我有一个简单的web方法
[WebMethod]
public int myWebMethod(string fileName, Byte[] fileContent)
Run Code Online (Sandbox Code Playgroud)
但是,每当我传递一个大于30mb的字节数组时,我都会收到错误:
HTTP错误404.13 - 未找到请求筛选模块配置为拒绝超过请求内容长度的请求.
我的web.config如下:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"> </compilation>
<authentication mode="Windows" />
<httpRuntime useFullyQualifiedRedirectUrl="true"
maxRequestLength="102400" requestLengthDiskThreshold="102400"
/>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="104857600"/>
</requestFiltering>
</security>
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我一直在搜索,这个问题最常见的原因是maxAllowedContentLength默认情况下属性为30mb.但是,我已将此设置为100mb,以及maxRequestLength属性httpRuntime.
我无法在任何地方找到解决方案,而不是设置我上面已尝试过的属性之一.有没有我错过的东西?
假设我有一些T必须N字节对齐的类型.现在我声明一个类型的数组T:
T array[size];
Run Code Online (Sandbox Code Playgroud)
阵列是否具有与类型相同的对齐要求,T还是具有任何其他对齐要求?
我习惯使用类似于下面的内容生成到MVC控制器操作中的其他控制器操作的路由URL:
public class ApplicationController : Controller
{
public ActionResult Index( )
{
var url = Url.RouteUrl("routename",
new { controller = "Application", Action = "Index2" , other="other" });
}
public ActionResult Index2( string other)
{
}
}
Run Code Online (Sandbox Code Playgroud)
但我也需要能够从webapi中生成到MVC控制器动作的URL,我将如何进行此操作?
APIController上似乎有一个UrlHelper属性,但我找不到任何如何使用它的例子,但我自己也无法弄明白.
更新:我尝试生成URL的原因是这个特定的webapi方法发送一封电子邮件,该邮件向收件人提供一个链接,指导用户返回网站的相应部分.我显然希望摆脱硬编码,因为它不适用于不同的部署,如果我开始更改路由,这个链接将被破坏.有没有更好的方法来做到这一点?
asp.net-mvc asp.net-mvc-routing urlhelper asp.net-mvc-4 asp.net-web-api
C++ 03 Standard将格式良好的程序(1.3.14 [defns.well.formed])定义为
根据语法规则,可诊断的语义规则和一个定义规则(3.2)构建的C++程序
它进一步定义了一个不正常的程序(1.3.4 [defns.ill.formed])as
输入到不是格式良好的程序的C++实现(1.3.14)
并且标准中充满了诸如"如果X那么程序是格式错误"的陈述,例如(2.13.1/3):
如果某个程序的翻译单元中包含一个无法用任何允许类型表示的整数文字,则该程序格式不正确.
然而,我还没有找到C++实现对于格式错误的程序需要做些什么.
假设我有一个不正确的程序.怎么办?
C++实现是否需要在遇到格式错误的程序时执行某些特定操作,或者C++实现行为是否未定义?
假设相同类型的两个指针指向同一个数组(或同一个对象),这样两个指针的减法和比较都是有效的...是否有任何情况
if(ptr1 - ptr2 > 0)
Run Code Online (Sandbox Code Playgroud)
会有不同的表现
if(ptr1 > ptr2)
Run Code Online (Sandbox Code Playgroud)
或者他们在任何时候都相同?
我目前正在审查一个非常古老的C++项目,并在那里看到许多代码重复.
例如,有一个包含5个MFC消息处理程序的类,每个消息处理程序包含10行相同的代码.或者,每个地方都有一个5行代码段用于非常具体的字符串转换.在这些情况下,减少代码重复不是问题.
但我有一种奇怪的感觉,我可能会误解某些东西,并且最初有这种重复的原因.
什么可能是重复代码的正当理由?
我有一堆代码,std::string比较类型的对象与字符串文字的相等性.像这样的东西:
//const std:string someString = //blahblahblah;
if( someString == "(" ) {
//do something
} else if( someString == ")" ) {
//do something else
} else if// this chain can be very long
Run Code Online (Sandbox Code Playgroud)
比较时间累积到一个严重的数量(是的,我描述),所以加快它是很好的.
代码将字符串与众多短字符串文字进行比较,这种比较很难避免.保留声明的字符串std::string很可能是不可避免的 - 有数千行代码.离开字符串文字和比较==也可能是不可避免的 - 重写整个代码将是一个痛苦.
问题是Visual C++ 11附带的STL实现使用了一些奇怪的方法.==映射到std::operator==(const basic_string&, const char*)哪些调用basic_string::compare( const char* ),这些调用又调用std::char_traits<char>( const char* )哪些调用strlen()来计算字符串文字的长度.然后对两个字符串运行比较,并将两个字符串的长度传递给该比较.
编译器很难分析所有这些并发出遍历字符串文字两次的代码.使用短文字,时间不多,但每次比较都涉及遍历文字两次而不是一次.简单地打电话strcmp()很可能会更快.
有没有什么我可以做的,比如编写一个自定义比较器类,有助于避免在这种情况下两次遍历字符串文字?
c++ ×6
c# ×3
.net ×1
arrays ×1
asp.net-mvc ×1
casting ×1
class-design ×1
constructor ×1
iis ×1
performance ×1
pointers ×1
stl ×1
string ×1
teamcity ×1
unit-testing ×1
urlhelper ×1
visual-c++ ×1