以下两段代码之间有什么区别:
using (Object o = new Object())
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
和
{
Object o = new Object();
// Do something
}
Run Code Online (Sandbox Code Playgroud)
我已经开始使用using更多但是我很好奇与范围对象相比实际上有什么好处.
编辑:我从中获取的有用花絮:
Jon Skeet:
请注意,这不会以任何方式,形状或形式强制进行垃圾收集.垃圾收集和快速资源清理有些正交.
埃德斯会评论:
除非您的类实现了IDisposable接口,并且具有Dispose()函数,否则不要使用.
只是想知道这意味着什么?我在网上看过很多具有以下语法的教程:
using (SqlCeCommand cmd2 = new SqlCeCommand("SELECT city FROM cities JOIN states ON states.id=cities.state WHERE states.state='" + read.GetString(0) + "'", con))
{
SqlCeDataReader readCities = cmd2.ExecuteReader();
while (readCities.Read())
{
parent.Nodes.Add(readCities.GetString(0));
}
}
Run Code Online (Sandbox Code Playgroud)
为什么用它?我尝试搜索Google,但它提供了'using'关键字,用于包含dll和其他文件.
我有三个组件一个C#控制台应用程序Main,Common和Utilities.
在一个文件Main汇编,Main.cs我也行:
using Utilities;
Run Code Online (Sandbox Code Playgroud)
在Common程序集中的目录中,我有DLL IBM.Data.DB2.dll.
在Utilities程序集中,我有一个访问所述dll的源模块.公用事业有一个参考IBM.Data.DB2.在这个程序集中的源文件中Util.cs,我有一行:
using IBM.Data.DB2;
Run Code Online (Sandbox Code Playgroud)
如果在此文件的方法中,我对DB2程序集中的代码进行了任何引用,如:
DbConnection c = new DB2Connection( _connectString );
Run Code Online (Sandbox Code Playgroud)
编译Main程序集时出现错误,指出Utilities无法找到命名空间名称.Utilities有或没有线编译罚款.如果我注释掉上面这一行,那么一切都很好.
这是我的静态类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Linq.Expressions;
using System.Text;
using System.Web;
namespace Foo.WebUI.Infrastructure
{
public static class HtmlHelpers
{
public static MvcHtmlString Image(this HtmlHelper helper, string src, string altText)
{
var builder = new TagBuilder("img");
builder.MergeAttribute("src", src);
builder.MergeAttribute("alt", altText);
return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
}
public static MvcHtmlString RadioButtonForEnum<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var names = Enum.GetNames(metaData.ModelType);
var sb = new StringBuilder();
foreach (var name in names)
{
var id = …Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2010中,我知道您可以使用PowerCommands扩展来右键单击 - >项目和"删除并排序使用",我也知道您可以在右键单击上下文菜单中基于单个文件组织使用.
我确实找到了创建一个新宏的指令,该宏在整个项目中执行了组织usings命令来执行此操作,但是并没有做到这一点 - 因为我相信Visual Studio 2012中不支持宏.
任何人对如何做这个大众都有任何想法?
C++ 11添加了别名模板,例如:
template<typename T> using identity = T;
template<bool b, typename T = void> using EnableIf = typename std::enable_if<b, T>::type;
Run Code Online (Sandbox Code Playgroud)
这些比template在::type字段中提供返回值的旧类型映射更容易使用,因为即使您的类型参数依赖于本地上下文,您也不需要通知编译器结果是类型.
实际上,您将typename使用位置提升到using别名.
有没有什么可以用来摆脱生产无关的templates?
假设您有一个元函数,其输出是类或别名模板而不是类型.目前的方法是这样的:
template<typename T>
struct my_meta {
template<typename U>
using Template = identity<U>;
};
template<typename T>
struct my_meta {
template<typename U>
using Template = int;
};
Run Code Online (Sandbox Code Playgroud)
我们可以这样使用:
template<typename T, typename U>
typename my_meta<T>::template Template<U>
do_stuff( U&& ) { return {}; }
Run Code Online (Sandbox Code Playgroud)
template返回类型中的额外关键字存在以消除我的元函数的返回值的歧义是我想要消除的.
有没有办法向编译器指示metacomputation的结果是C++ 11或C++ 1y中的另一个别名或类模板,而不template在调用位置使用关键字? …
出于方便和安全的原因,我想使用该using语句来分配和释放来自/到池的对象
public class Resource : IDisposable
{
public void Dispose()
{
ResourcePool.ReleaseResource(this);
}
}
public class ResourcePool
{
static Stack<Resource> pool = new Stack<Resource>();
public static Resource GetResource()
{
return pool.Pop();
}
public static void ReleaseResource(Resource r)
{
pool.Push(r);
}
}
Run Code Online (Sandbox Code Playgroud)
和访问池一样
using (Resource r = ResourcePool.GetResource())
{
r.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
我找到了一些关于滥用using和Dispose()范围处理的主题,但所有这些主题都包含在内using (Blah b = _NEW_ Blah()).
在离开使用范围但保留在池中之后,不会释放对象.
如果using语句只是简单地扩展到一个简单,try finally Dispose()这应该工作正常但是在幕后会发生更多的事情,或者在未来的.Net版本中这种情况不会发生吗?
我知道using可以做一些事情typedef做不到.
我只是想知道在所有情况下是否using可以完全取代typedef?
在C++ 11中,可以通过声明使外部(公共)可以访问私有基类的公共成员using.例如
class A {
private:
int i = 2;
public:
void f() { i = 3; }
friend bool operator==(const A& l, const A& r) { return l.i == r.i; }
};
class B : private A {
public:
using A::f;
};
int main() {
B b, b2;
b.f();
}
Run Code Online (Sandbox Code Playgroud)
b.f()因为using A::f在定义中是可能的B.
是否有可能编写一个类似的声明,它可以使友元函数的up-cast B&成为A&可能operator==(A&, A&),以便b == b2可以调用main()?
我想知道是否有一些方法可以优化using语句来声明并将其输出分配在一起(当它是单个值时).
例如,类似于内联新方法的东西声明了out参数的结果变量.
//What I am currently doing:
string myResult;
using(var disposableInstance = new myDisposableType()){
myResult = disposableInstance.GetResult();
}
//That would be ideal
var myResult = using(var disposableInstance = new myDisposableType()){
return disposableInstance.GetResult();
}
//That would be great too
using(var disposableInstance = new myDisposableType(), out var myResult){
myResult = disposableInstance.GetResult();
}
Run Code Online (Sandbox Code Playgroud)
感谢您的输入.