"文件和字体是访问非托管资源的托管类型的示例(在本例中为文件句柄和设备上下文).还有许多其他类型的非托管资源和类库类型封装它们.所有这些类型都必须实现IDisposable接口.一个规则,当你使用IDisposable对象时,你应该在using语句中声明并实例化它." - MSDN
是否有这样的案例列表(访问非托管资源的托管类型,如FILE和FONT,......)应该使用USING语句?
有人可以帮我找到以下错误的解决方案:
"致命错误C1190:托管目标代码需要'/ clr'选项"
我的配置是......
这是代码(我通过使用网络资源获得)
#using <mscorlib.dll>
using namespace System;
using namespace System::IO;
int main() {
// Create a reference to the current directory.
DirectoryInfo* di = new DirectoryInfo(Environment::CurrentDirectory);
// Create an array representing the files in the current directory.
FileInfo* fi[] = di->GetFiles();
Console::WriteLine(S"The following files exist in the current directory:");
// Print out the names of the files in the current directory.
Collections::IEnumerator* myEnum = fi->GetEnumerator();
while (myEnum->MoveNext()) {
FileInfo* fiTemp = __try_cast<FileInfo*>(myEnum->Current); …Run Code Online (Sandbox Code Playgroud) clr using-statement directoryinfo visual-studio-2008 windows-7
你有没有办法建议帮助摆脱调用Initialize()和Close()方法并将其替换为使用块?
或者这种方法完全没问题?
(想法是确保当FooWriter的消费者写下一些字符串并完成此操作时将处理Writer.)
class Program
{
static void Main(string[] args)
{
var writer = new FooWriter();
writer.Initialize();
foreach (var s in args)
writer.Write(s);
writer.Cose();
}
public class FooWriter
{
public StreamWriter Writer;
public void Initialize()
{
Writer = new StreamWriter("MyFile.txt", false);
}
public void Write(string line)
{
if(Writer==null)
throw new NullReferenceException(Writer, "Writer"); // Guard Writer
Writer.WriteLine(line);
}
public void Close()
{
Writer.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud) 当创建一个实现一个元素IDisposable,Dispose()是在结束所谓的using块还,如果抛出一个异常,如果我是正确的.
但是,在ClassB一次性元素的构造函数中创建新元素时,如果IDisposable实现了ClassB的对象,是否也会被处置?
using (ClassA a = new ClassA(new ClassB()))
{
}
Run Code Online (Sandbox Code Playgroud)
这可能适用于与之相关的类Stream.但是,这一般适用吗?
在FileWriter将由不同线程使用的类中,我当前使用a ReaderWriterLockSlim来防止当两个线程同时尝试写入文件时发生的错误,如下所示:
(1)
public class FileWriter
{
private ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();
public void WriteToFile(string message)
{
try
{
this.readerWriterLock.EnterWriteLock();
// the writing happens here
}
finally
{
this.readerWriterLockSlim.ExitWriteLock();
}
}
}
Run Code Online (Sandbox Code Playgroud)
哪个确实有效.但在那之后,我读了那个ReaderWriterLockSlim工具IDisposable,所以我想知道是否
(2)
public class FileWriter
{
public void WriteToFile(string message)
{
using (ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim())
{
readerWriterLockSlim.EnterWriteLock();
// the writing happens here
readerWriterLockSlim.ExitWriteLock();
}
}
}
Run Code Online (Sandbox Code Playgroud)
将是"更好"的方法,是否会引入一些新的缺点.我的直觉告诉我,每次调用该方法时我可能不应该创建一个新的ReaderWriterLockSlim,而只是一次(2) …
对于 C# 来说还是比较陌生。我的代码给了我想要的结果,但我不确定我是否以正确的方式实现了它。如果您想回答,请详细说明。我的目标是通过 搜索我的 MongoDB 中的条目FindAsync。这是我的代码:
public async Task<List<T>> SearchDocAsync<T, U>(string collection,
string findFieldName, U findValue)
{
var _collection = db.GetCollection<T>(collection);
var filter = Builders<T>.Filter.Eq(findFieldName, findValue);
var result = await (_collection.FindAsync(filter).Result.ToListAsync());
return result;
}
Run Code Online (Sandbox Code Playgroud)
这是我在 WinForms 中的调用方式:
private async void BtnReadAll_Click(object sender, EventArgs e)
{
var asyncResults = await myMongoAux.SearchDocAsync<MyTModel, string>(
myCollectionName, "MyDBString", "TestString");
foreach (var r in asyncResults)
{
RtxbxResult.Text += $"{r.MyDBInt}\t{r.MyDBString}\n";
}
}
Run Code Online (Sandbox Code Playgroud)
这安全吗?我不应该使用 a using(但如何使用)?我读过一些关于你应该使用的内容:
配置等待(假)
如何以及为何?
非常友善,帮助我了解更多。感谢您的时间。:)
IDisposable我确信这是一个简单的问题,但是在没有 using 语句的情况下处理对象时我应该做什么?
每个人都知道在我们想要清理非托管资源时使用using关键字.
如果该类实现,IDisposable那么我们可以使用using该类对象的关键字.但是如果我想在using我自己的类的对象中使用关键字,那么我该如何使用它.
如果我必须IDisposable在我自己的类中实现,那么我还必须在我的类中编写其Dispose()方法的代码.using当我在Dispose()方法中编写自己的代码时,没有必要在这里使用关键字.那么我如何在用户定义的类型(如类和结构)中使用.
请举一些例子说明.
我读了这篇文档,但我仍然感到困惑.
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
Run Code Online (Sandbox Code Playgroud)
在代码中,是否意味着我们引入了一个名为Font类的新实例font1.但是,此实例仅在大括号内存活.在代码中我们可以再次实例化,font1但这将是一个完全不同的实例,因为前一个font1是disposed.
它是否正确?那么目的是什么?我们可以重新分配不同的值font1而不处理前一个值?