使用ReSharper移动/更新名称空间声明时,有没有办法阻止ReSharper删除未使用的Using语句?
换句话说,如果我有一个类,如:
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
namespace Foo.Bar
{
class MyClass
{
List<string> Names { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用ReSharper将它移动到Foo.Bar.Utilities命名空间,Resharper将删除所有未使用的Using语句,并留下我:
using System.Collections.Generic;
namespace Foo.Bar.Utilities
{
class MyClass
{
List<string> Names { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不希望ReSharper在移动命名空间声明时触摸我的Using语句.我希望结果如下:
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
namespace Foo.Bar.Utilities
{
class MyClass
{
List<string> Names { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud) 我using在C#和VB中都使用了该语句.我同意所有关于使用语句嵌套的批评者(C#似乎做得很好,VB不是那么多)
因此,考虑到这一点,我有兴趣通过在同一块中"使用"多个系统资源来改进我的VB使用语句:
例:
Using objBitmap As New Bitmap(100,100)
Using objGraphics as Graphics = Graphics.From(objBitmap)
End Using
End Using
Run Code Online (Sandbox Code Playgroud)
可写成这样:
Using objBitmap As New Bitmap(100,100), objGraphics as Gaphics = Graphics.FromImage(objbitmap)
End Using
Run Code Online (Sandbox Code Playgroud)
所以我的问题是什么是更好的方法?
我的直觉告诉我,如果资源是相关/依赖的,那么在using语句中使用多个资源是合乎逻辑的.
对于使用cout,我需要指定两者:
#include<iostream>
Run Code Online (Sandbox Code Playgroud)
和
using namespace std;
Run Code Online (Sandbox Code Playgroud)
在哪里cout定义?在iostream,对吗?那么,它iostream本身就是命名空间std吗?
关于使用的两个陈述的含义是什么cout?
我很困惑为什么我们需要将它们都包括在内.
注意:对象生命周期RAII不使用/与块范围RAII
似乎可以使用额外的gc类别,短期对象(经常检查gc类别),长期存在的对象(不常检查gc类别)和资源对象(非常频繁地检查gc类别).或者可能使用额外的引用计数资源对象的gc.
似乎使用/ with style可以通过促进I/O的更多功能风格(原谅我,如果我错了,这不是功能风格)来阻止大量的I/O扩散到地方vs基于对象的RAII的灵活性(因为它更容易).但是一些问题可能需要很难跟踪资源的生命周期.
有没有理由除了避免gc的复杂性和速度,还没有在主流语言上做到这一点?(我知道有些语言在其主要实现中使用引用计数作为gc的一部分,因此,RAII可能在那里工作,但我认为他们的规范没有为某些类型的对象/或所有对象指定引用计数,并且人们使用的其他实现没有引用计数,限制了对象生存期RAII在这些语言中的使用.
PS:他们在perl中有c ++类型的RAII吗?
garbage-collection raii using-statement with-statement object-lifetime
我已经将所有调用WCF调用的代码包装在一个using语句中,以为该对象将被正确放置.当我在谷歌搜索异常"位于...的Http服务太忙"时,我发现这个链接http://msdn.microsoft.com/en-us/library/aa355056.aspx说不应该使用using语句键入的代理.这是真的吗?我想我有一个很大的代码改变(叹气).此问题仅出现在类型代理中吗?
示例代码:
private ServiceClient proxy;
using(proxy = new ServiceClient("ConfigName", "http://serviceaddress//service.svc")){
string result = proxy.Method();
}
Run Code Online (Sandbox Code Playgroud) 我有一些代码有很多重复.问题来自我正在处理嵌套IDisposable类型的事实.今天我有一些看起来像:
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
}
}
public bool GetSomeValueById(Guid innerId)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
return c.GetSomeValue();
}
}
Run Code Online (Sandbox Code Playgroud)
using对于这些方法中的每一个,整个嵌套块都是相同的(显示了两个,但是大约有十个).唯一不同的是当你到达using块的内层时会发生什么.
我想的一种方法是做一些事情:
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
ActOnC(innerId, c =>
{
var cWrapper = new SomeWrapper(c); …Run Code Online (Sandbox Code Playgroud) 如果我有一个围绕try catch语句的using块,那么using语句中的对象会发生什么情况?catch会触发异常吗?请考虑以下代码:
using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse())
{
try
{
Foo();
}
catch (ArgumentNullException e)
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们假设Foo()失败并且触发了异常并且有效地破坏了程序将处理databaseConnectivityObject吗?这很重要的原因是该对象具有与之关联的数据库连接.
以下面的例子为例......
Using cn As New SqlConnection(ConnectionString)
Try
Dim cmd As SqlCommand = New SqlCommand
With cmd
.Connection = cn
.Connection.Open()
.CommandText = "dbo.GetCustomerByID"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
da.Fill(ds, "Customer")
Catch ex As Exception
End Try
End Using
Run Code Online (Sandbox Code Playgroud)
根据我今天的研究,听起来好像这基本上还可以,但是SqlCommand没有被处理掉.
问题 - >以下哪个例子是处理此问题的最佳方法?
示例2 - 手动处理
Using cn As New SqlConnection(ConnectionString)
Try
Dim cmd As SqlCommand = New SqlCommand
With cmd
.Connection = cn
.Connection.Open()
.CommandText = "dbo.GetCustomerByID"
.CommandType = CommandType.StoredProcedure …Run Code Online (Sandbox Code Playgroud) 虽然我的假设似乎听起来很主观,但经过一些研究后,我发现找到喜欢虚拟对象的开发人员Try/Catch而不是使用Using语句进行IDbConnection/IDbTransaction处理(Close/Commit/Rollback)并不罕见.
即使是一些经验最丰富的开发人员和一些新开发人员也是如此.我故意不会在StackOverflow或论坛链接上引用任何问题作为示例,因此人们不会被冒犯.根据我的发现,使用声明是安全的(没有双关语).
它有什么问题吗?请考虑以下代码:
Public Sub Commit()
Dim cn As IDbConnection = {CREATE_CONNECTION}
Dim tran As IDbTransaction = Nothing
cn.Open()
Try
tran = cn.BeginTransaction
'run some queries here
tran.Commit()
Catch ex As Exception
If Not tran Is Nothing Then tran.Rollback()
Throw
Finally
cn.Close()
End Try
End Function
Run Code Online (Sandbox Code Playgroud)
假设{CREATE_CONNECTION}是一个Sub创建连接的占位符,具体取决于数据库供应商,根据所有可能的最佳实践编写,并且不需要更多改进.
有没有理由说上面的代码不能这样重写:
Using cn As IDbConnection = {CREATE_CONNECTION}
cn.Open()
Using tran As IDbTransaction = cn.BeginTransaction
'run some queries …Run Code Online (Sandbox Code Playgroud) 我FileResult : IHttpActionResult为api调用创建了一个webapi返回类型.FileResult从另一个URL下载文件,然后将流返回给客户端.
最初我的代码有using如下声明:
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
using (var httpClient = new HttpClient())
{
response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new System.Net.Http.StreamContent(
await httpClient.GetStreamAsync(this.filePath))
};
}
return response;
}
catch (WebException exception)
{...}
}
Run Code Online (Sandbox Code Playgroud)
然而,这会间歇性地导致TaskCanceledException.我知道如果在异步调用完成之前处理了HttpClient,Task的状态将变为取消.但是因为我使用了await:Content = new System.Net.Http.StreamContent(await httpClient.GetStreamAsync(this.filePath))这应该可以防止HttpClient在任务完成过程中被丢弃.
为什么该任务被取消?这不是因为超时,因为这发生在最小的请求上,并不总是发生在大请求上.
当我删除using语句时代码正常工作:
public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
try
{
HttpResponseMessage response;
var httpClient = new HttpClient();
response = new …Run Code Online (Sandbox Code Playgroud) c# using-statement httpclient task-parallel-library asp.net-web-api
using-statement ×10
c# ×6
vb.net ×3
.net ×1
c++ ×1
coding-style ×1
dispose ×1
httpclient ×1
include ×1
namespaces ×1
raii ×1
refactoring ×1
resharper ×1
sqlcommand ×1
transactions ×1
using ×1
wcf ×1