可能重复:
java中的"using"关键字
我正在从C#转换到java,所以请耐心等待...
在C#中读取文件时,只需将其全部包装在一个大的"使用"块中,这样如果您有异常,该文件仍将被关闭.像这样(可能不准确,但你明白了):
using(FileStream fs = new FileStream("c:\\myfile.txt")) {
// Any exceptions while reading the file here won't leave the file open
}
Run Code Online (Sandbox Code Playgroud)
java 5或6中是否有方便的等价物?我得到的印象是,最近java一直在"借用"来自c#的一些语法糖(例如foreach),所以如果有一个类似于使用这些天的java,我也不会感到惊讶.
或者我只需要使用try..finally块?我认为'使用'真是太好了......
使用之间有什么区别
typedef Some::Nested::Namespace::TypeName TypeName;
Run Code Online (Sandbox Code Playgroud)
要么
using Some::Nested::Namespace::TypeName;
Run Code Online (Sandbox Code Playgroud)
提供TypeName当地范围的速记?
我正在使用Lidgren,并且对于我制作的每种新类型的消息,我最终都编写了相同类型的代码.我正在创建一个实例NetOutgoingMessage,在其上运行各种赋值调用,然后在完成后发送它.创建和发送是一样的,所以我想写一个包装器来为我做这个,但它是一个sealed类,它不是IDisposable.我正在做的是:
NetOutgoingMessage om = server.CreateMessage();
om.Write(messageType);
om.Write(data1);
om.Write(data2);
server.SendMessage(om, server.Connections, NetDeliveryMethod.UnreliableSequenced, 0);
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
using(AutoNetOutgoingMessage om(server, messageType, NetDeliveryMethod.UnreliableSequenced))
{
om.Write(data1);
om.Write(data2);
}
Run Code Online (Sandbox Code Playgroud)
显然我不能这样using做是否有另一种常见的方法,如果实现这样的功能?我不是在寻找一个非常复杂的解决方案,因为这只是关于我的可维护性,所以我没有问题为每条消息重复我的代码.但我很好奇是否有一个有趣的C#技巧我不知道为此.
我有一个方法,里面有一个try/catch/finaly块.在try块中,我声明SqlDataReader如下:
SqlDataReader aReader = null;
aReader = aCommand.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
在finally块中,手动处理的对象是在类级别设置的对象.因此,在该方法的对象,其实现IDisposable,如SqlDataReader上述,他们得到自动处理的?Close()在aReader执行while循环后调用,以获取阅读器的内容(应该是Dispose()调用的内容Close()).如果没有调用Close(),当方法完成或对象超出范围时,是否会自动关闭/处置此对象?
编辑:我知道这个using声明,但有些情况令我感到困惑.
我想知道为什么不编译?
public static void Main(string[] args)
{
using (MyStruct sss = new MyStruct())
{
sss.s = "fsdfd";// Cannot modify members of 'sss' because it is a 'using variable'
//sss.Set(12); //but it's ok
}
}
public struct MyStruct : IDisposable
{
public int n;
public string s;
public void Set(int n)
{
this.n = n;
}
public void Dispose()
{
Console.WriteLine("dispose");
}
}
Run Code Online (Sandbox Code Playgroud)
更新:但它完美无缺.为什么?
public static void Main(string[] args)
{
using (MyClass sss = new MyClass())
{
sss.Field = "fsdfd"; …Run Code Online (Sandbox Code Playgroud) 我在debian-7-wheezy上运行一个实例,我对Google Compute Engine有点新意.我查看了本网站上的支持请求和Google网站上的常见问题解答帖子; 但是我发现没有什么可以完全遵循的.
我知道一小部分关于Linux(管理一个专用的Debian盒子大约6个月),但我也无法从家用PC访问SSH.
我希望逐步了解如何使用WinSCP(或其他文件浏览器)访问FTP/SFTP,以及如何使用Putty从创建实例到连接实例来从家用PC访问SSH .
提前感谢您的帮助,对不起是一个新手.
我知道VS2008具有删除和排序功能,可以使用指令清理,Resharper也是如此.除了你的代码"干净"并消除了引用未来可能不存在的命名空间的问题,维护一个"干净"的使用指令列表有什么好处?
更少的代码?编译时间更快?
我在代码示例中看到了这个C#using语句:
using StringFormat=System.Drawing.StringFormat;
Run Code Online (Sandbox Code Playgroud)
那是什么意思?
在大多数情况下,C#编译器似乎可以Dispose()自动调用.像大多数使用模式的情况看起来像:
public void SomeMethod()
{
...
using (var foo = new Foo())
{
...
}
// Foo isn't use after here (obviously).
...
}
Run Code Online (Sandbox Code Playgroud)
因为foo没有使用(这是一个非常简单的检测),并且由于它没有作为参数提供给另一个方法(这是一个适用于许多用例并且可以扩展的假设),编译器可以自动并立即调用Dispose()而无需开发人员需要做到这一点.
这意味着在大多数情况下,using如果编译器做了一些聪明的工作,那么它就没用了.IDisposable似乎低水平足以让我被编译器考虑在内.
现在为什么不这样做?这不会改善性能(如果开发人员...... 很脏).
我在C#中有以下异步函数:
private async Task<T> CallDatabaseAsync<T>(Func<SqlConnection, Task<T>> execAsync)
{
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
return await execAsync(connection);
}
}
Run Code Online (Sandbox Code Playgroud)
它允许执行任何异步函数execAsync,它将SQL连接作为参数并通过提供连接对象并确保它将被正确关闭来使用它来进行数据库调用.
然后从WebApi控制器中的操作调用此函数,如下所示:
public async Task<HttpResponseMessage> MyAction()
{
Func<SqlConnection, Task<SomeType>> execAsync = (function definition here);
await CallDatabaseAsync(execAsync);
return Request.CreateResponse(HttpStatusCode.OK);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很有效,直到我对WebApi操作进行了一次更改:我从中删除了异步/等待.我不想等待数据库调用,因为我不关心结果,我只是想解雇并忘记.
这仍然似乎工作正常 - 即如果我在浏览器中导航到操作的URL我没有得到任何错误.但实际上有一个问题 - 数据库连接没有关闭.在100次调用操作后,连接池达到其默认限制100,并且应用程序停止工作.
我究竟做错了什么?我需要在CallDatabaseAsync()中进行哪些更改,以便绝对确保连接将被关闭,无论如何?