我正在为用户控件编写一个相当复杂的绘制方法,涉及大量的绘图代码.我知道所有GDI +资源都需要妥善处理,所以我将每个资源包装在一个using块中.
但当我注意到我使用using了三个不同的三个块时,SolidBrushes我想知道我是否不能再重复使用它们.创建一个SolidBrush,用它绘制,分配不同的颜色,绘制其他东西等.然后放在Dispose()最后.
这样的事情是可取的还是我在这里想的太难了?我并不特别喜欢using彼此嵌套的太多块.虽然一个很好的模式,但它有时会妨碍可读性.
当子类重写基类的方法时,子类中不能获得所有基类的重载.为了使用它们,应该using BaseClass::Method;在子类中添加一行.
是否有一种快速方法可以为所有重写方法设置基类的重载?(不需要using ...为每个方法明确指定)
我已阅读并且我相信我理解C#的using语句是什么(如果我错了请纠正我):将IDisposable对象初始化为只读有限范围(using块).我知道你可以在之前初始化using并且不限制范围,但建议不要这样:
http://msdn.microsoft.com/en-us/library/yh598w02.aspx
我并不总是关注哪些类是什么类的子类.我不太确定哪些类继承自IDisposable.我不只是好奇在一个using语句中可以使用哪些类,但是我的同事希望在一个using块中找到哪些类?块中应该包含哪些类using?另外,没有使用using块而不调用Dispose 有什么问题吗?它只是关于记忆还是稳定?
我正在处理的项目在类中的每个方法中使用IDisposable对象.它已经开始在每个方法的开头重新输入使用块的繁琐乏味,并且想知道是否有一种方法来指定用于类的每个方法的一次性变量?
public static class ResourceItemRepository
{
public static ResourceItem GetById(int id)
{
using (var db = DataContextFactory.Create<TestDataContext>())
{
// Code goes here...
}
}
public static List<ResourceItem> GetInCateogry(int catId)
{
using (var db = DataContextFactory.Create<TestDataContext>())
{
// Code goes here...
}
}
public static ResourceItem.Type GetType(int id)
{
using (var db = DataContextFactory.Create<TestDataContext>())
{
// Code goes here...
}
}
}
Run Code Online (Sandbox Code Playgroud) 我在我的项目中有一段代码,我在另一个使用块中包含一个使用块,我想知道这是一个好习惯还是矫枉过正(请注意我明白这是一个非常简单的代码片段,它是仅用于说明目的):
protected void Submit_Click(object sender, EventArgs e)
{
try
{
using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegConnectionString"].ConnectionString))
{
cn.Open();
string cmdStr = "SELECT COUNT(*) FROM REGISTRATION WHERE UserName ='" + this.TextBoxUN.Text + "' ";
using (SqlCommand selectUser = new SqlCommand(cmdStr, cn))
{
int temp = Convert.ToInt32(selectUser.ExecuteScalar().ToString());
if (temp == 0)
{
string insCmd = "Insert INTO REGISTRATION (UserName, Password, EmailAddress, FullName, Country) VALUES (@UserName, @Password, @EmailAddress, @FullName, @Country)";
using (SqlCommand insertUser = new SqlCommand(insCmd, cn))
{
try
{
insertUser.Parameters.AddWithValue("@UserName", this.TextBoxUN.Text);
insertUser.Parameters.AddWithValue("@Password", …Run Code Online (Sandbox Code Playgroud) 有没有办法重构这个代码,不必使用临时变量,仍然使用与对象初始化器相关的语法糖?
FrmSomeForm someTempForm = new FrmSomeForm()
{
SomePropA = "A",
SomePropB = "B",
SomePropC = "C"
};
using (FrmSomeForm someForm = someTempForm)
{
someForm.ShowDialog();
}
Run Code Online (Sandbox Code Playgroud) 我正和一位同事讨论使用声明的适当范围.这是有问题的方法.
public Guid IsServerReachable()
{
try
{
WhoAmIResponse whoAmI;
using (OrganizationServiceProxy service = GetService())
whoAmI = service.Execute(new WhoAmIRequest()) as WhoAmIResponse;
return whoAmI.UserId;
}
catch { return Guid.Empty; }
}
Run Code Online (Sandbox Code Playgroud)
我们中的一个人声称using语句应该包含whyAmI的声明,而另一个声明它只是需要使用ified的服务实例.我不是说我的理论是哪一个,但显然是错误的.哪一个?
我创建了一个PhoneBook风格的应用程序; 在我的电话簿对象上,我有一个本地成员_site用作过滤器,因为大约有1000个电话号码,分成我组织内的12个站点.使用此方法一次只能检索一个站点.
这是我原来的方法.GUI具有重新排序的数据的方法,所以我把它作为一个IQueryable,因为我想推迟SQL允许过滤要在SQL服务器上,而不是在客户端PC上完成的.
作品
public IQueryable<PhoneNumber> GetPhoneDirectory()
{
PhoneBookDataContext db = new PhoneBookDataContext())
return db.PhoneNumbers.Where(d => d.Site == _site);
}
Run Code Online (Sandbox Code Playgroud)
但是,我也在努力保持using声明方面的"最佳实践" .
不起作用
public IQueryable<PhoneNumber> GetPhoneDirectory()
{
using (PhoneBookDataContext db = new PhoneBookDataContext())
{
return db.PhoneNumbers.Where(d => d.Site == _site);
}
}
Run Code Online (Sandbox Code Playgroud)
正如@justanotheruseryoumay指出的那样,这将导致异常,因为datacontext在访问对象时被释放.
我想我是问,我怎么能保证我的数据上下文是很好的布置,当我不能使用"使用"的语句并在上下文与做不严格知道.
按标题提问.
我有一段代码可以做到这一点:
using (SqlConnection dbcon = new SqlConnection(connectionString))
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(statement, dbcon))
{
dat_set = new System.Data.DataSet();
dbcon.Open();
dataAdapter.Fill(dat_set, name);
}
Run Code Online (Sandbox Code Playgroud)
当我在dataAdapter仍然填充数据集时强制退出程序时,程序冻结并停止响应.
我知道"使用"块在超出范围时释放资源,但在强制终止的情况下,资源是否优雅地释放?
关于这个主题有很多问题,但是我没有找到一个涵盖我特别需要理解的内容.
我的一位开发人员编写了这段代码:
//
// ValidationDataTable is a typed DataTable, generated by the Framework
ValidationDataTable validationTable;
using (ValidationTableAdapter adapter = new ValidationTableAdapter ()) {
using (validationTable = adapter.GetData()) { }
}
datafeedValidators.Add(new CountryFieldValidator(validationTable.ToDictionary(key => key.CountryCode, value => value.CountryName)));
// Party on...
//
Run Code Online (Sandbox Code Playgroud)
我的理解:本validationTable已被释放,但是当它在过去的代码生产线的引用不收集垃圾-但应该还是有抛出ObjectDisposedException的.ToDictionary()呼叫.但是这段代码很乐意构建一个有效的字典并继续前进.
我有理论,但找不到确定或击落其中任何一个的确定性.并且可以通过十几种方式重写代码以避免问题; 那不是问题.我只需要知道我理解的差距是什么.
我的问题:
DataTable在处理对象之后是否存在允许访问的特定内容- 类似于GZipStream类要求您处理对象以刷新流的方式,因此允许在对象被处理之后.ToArray()和.GetBuffer()之后调用?.
澄清:
这是一个.NET Framework问题.共识是我的理解是正确的 - DataTable本身必须抛出ObjectDisposedException.除了它没有.不是DataTable源代码中的任何地方 - 因此我的要求.我假设框架将在它被处理后确保一个ObjectDisposedException,这显然不是这种情况......与GZipStream不同,GZipStream只允许在Dispose()之后访问两个方法,即DataTable DGAF.精细.
因此,让我重新解释一个问题:DataTable内部是否有任何内容可以轰炸我们,因为允许调用已分配的表?我可以假设微软没有在内部清理任何内容,只要对象在范围内,所有属性和值都将保持不变,这似乎不是一个安全的假设.这段代码无论如何都会消失 - 我只是想了解微软是否允许访问DataTable,Dispose()或者是疏忽,而不是关心等等.
此外,如果您投票或投票关闭它,请留下评论原因.
using-statement ×10
c# ×9
dispose ×3
idisposable ×2
refactoring ×2
using ×2
c++ ×1
code-reuse ×1
gdi+ ×1
inheritance ×1
linq ×1
linq-to-sql ×1
overloading ×1
overriding ×1
scope ×1