小编Jul*_*les的帖子

我是否需要在托管对象上调用Dispose()?

我无法相信我仍然对此感到困惑但是,无论如何,让我们最终指出:

我有一个类覆盖OnPaint来做一些绘图.为了加快速度,我在构造函数中预先创建了笔,画笔等,以便OnPaint不需要继续创建和处理它们.

现在,我确保我总是处理这些对象,但我感觉我不需要,因为尽管它们实现了IDisposable,但它们都是托管对象.

它是否正确?


感谢所有的答案,这个问题肯定已被钉上了.
我很高兴我一直保持警惕,总是使用'​​使用',所以我不需要经历所有的代码检查.我只想清楚我不是一个毫无意义的用户.

顺便说一句,我确实有一个奇怪的情况,最近,我不得不更换一个使用块并手动调用dispose!我会把它挖出来并创造一个新问题.

.net idisposable

28
推荐指数
3
解决办法
6312
查看次数

使用WriteValue进行手动数据绑定

如果我通过设置DataSourceUpdateMode = Never来关闭绑定数据源的自动更新然后使用按钮来更新整个批次(使用binding.WriteValue),则会出现问题 - 即,仅更新第一个绑定控件的数据源.所有其他控件将重置为原始值.

这是因为当当前对象发生更改时(如上面的WriteValue之后),如果ControlUpdateMode = OnPropertyChange,则所有其他控件都会重新读取数据源中的值.

避免这个问题的标准方法是什么?

一种方法是从BindingSource派生一个类并添加一个WriteAllValues方法.此方法执行以下操作:

(1)对于每个Binding,保存ControlUpdateMode

(2)对于每个Binding,设置ControlUpdateMode = Never

(3)对于每个Binding,调用WriteValue方法

(4)对于每个Binding,将ControlUpdateMode重置为保存的值

(5)对于每个Binding,如果ControlUpdateMode = OnPropertyChange,则调用ReadValue方法.

你能看到这样做有什么问题吗?

如果使用自己的类,实现IEditableObject会解决问题吗?

在我正在研究的另一个控件中,我实现了自己的绑定.我解决这个问题的方法是使用以下代码.(我已经把它放在最低限度,我希望你能遵循它!):

Private Shared ControlDoingExplicitUpdate As MyCustomControl = Nothing

Private Sub UpdateDataSourceFromControl(ByVal item As Object, ByVal propertyName As String, ByVal value As Object)
  Dim p As PropertyDescriptor = Me.props(propertyName)
  Try
    ControlDoingExplicitUpdate = Me
    p.SetValue(item, value)
  Catch ex As Exception
    Throw
  Finally
    ControlDoingExplicitUpdate = Nothing
  End Try
End Sub

Private Sub DataBindingSource_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs)
  If (ControlDoingExplicitUpdate …
Run Code Online (Sandbox Code Playgroud)

.net vb.net data-binding bindingsource winforms

8
推荐指数
1
解决办法
3857
查看次数

取消数据绑定控件验证事件不会抑制尝试更新数据源

我没有得到我希望绑定到业务对象中的整数属性的TextBox的行为.

这是我做的:

(1)将DataSourceUpdateModeTextBox设置为:OnValidation.

(2)如果Validating是TextBox,请设置e.Cancel = TrueInteger.TryParse是否失败.

(3)在处理程序中添加处理程序Binding.ParseBinding.BindingComplete在处理程序中放置断点.

运行应用程序,将"asdasd"放在TextBox和tab中.尽管设定e.Cancel = True,但事件ParseBindingComplete事件都被提出.根据文档,设置e.Cancel = True应该抑制任何进一步的逻辑.

我搜索了MSDN,找出为什么会发生这种情况,但我找不到任何东西.有没有人知道我在哪里可以得到一些细节?

ETA:我还为Validated事件添加了一个句柄.这是事件的顺序:

数据不好:

(1)验证.(我设定e.Cancel = True)

(2)解析

(3)BindingComplete

好数据:

(1)验证

(2)解析

(3)BindingComplete

(4)经过验证

ETA2:更多信息和解决方法.

此行为的问题是,如果您有一些未在属性设置器中实现的验证.

例如,假设我的整数属性必须是奇数.我没有在属性设置器中检查这个,所以我在验证事件中进行检查.

如您所见,根据上述行为,即使我取消验证,作为合法整数的值也将写入数据源.

尽管数据源已更新,但如果在验证事件中设置了"取消",则不会触发Validated事件,因此您仍然可以阻止用户继续进行.

变通::

要停止数据源更新,您需要在Binding.Parse事件中进行验证,并抛出异常 - 这会阻止Binding成功完成.

.net vb.net data-binding validation winforms

8
推荐指数
1
解决办法
2050
查看次数

如果我替换PictureBox控件中的图像,我应该首先处理原始图像吗?.Net Winforms

根据我的问题,如果我替换图片框中的图像,我应该首先处理原始图像吗?

或者,这种情况怎么样:

Dim bm As New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  
bm = New Bitmap(32,32)  
Run Code Online (Sandbox Code Playgroud)

是否bm只需要在最后处置,还是应该在每次重新创建之前处置?


谢谢大家的答案.在我身上有一个很大的疏忽.我知道一个控制部门负责处理它的孩子,但我没有想到如果我更换它,我应该处理一个旧图像.

.net c# vb.net idisposable winforms

8
推荐指数
1
解决办法
3209
查看次数

关于.Net中通用字典中的引用类型键的快速问题

我有一个可变类,我用它作为通用字典的关键.只有当它们的引用相等时,两个键才应该相等.根据我的阅读,在这种情况下,我不需要重写Equals,GetHashCode或实现IEqualityComparer.

它是否正确?

.net c# vb.net dictionary reference-type

7
推荐指数
1
解决办法
3927
查看次数

如何在.NET中添加对mshtml版本9的引用

我想使用mshtml.dll 9.0版的一些新功能,如IHTMLCSSRule.

以下文件夹中的互操作版本是版本7.0.3300.1:

C:\ Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll

以下文件夹中的COM版本是版本9.0.8112.16441:

C:\ WINDOWS\SYSTEM32\Mshtml.dll中

从我可以从网上确定,我应该这样做来创建一个.NET互操作版本9:

d:\ zTemp> tlbimp mshtml.tlb /out:Microsoft.mshtml.dll/namespace:mshtml/asmversi on:9.0

这似乎有效,但产生了以下警告:

TlbImp:警告TI3001:主互操作程序集'Microsoft.mshtml,Version = 7.0.3300.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'已经注册了类型库'C:\ Windows\system32\mshtml.tlb'.TLBIMP

:警告TI3016:类型库导入程序无法转换成员'mshtml._userBITMAP.pBuffer'的签名.TlbImp:

警告TI3016:类型库导入程序无法转换成员'mshtml._FLAGGED_BYTE_BLOB.abData'的签名.TlbImp:

警告TI3015:运行时封送程序无法对"mshtml.ICanvasPixel ArrayData.GetBufferPointer"中的至少一个参数进行封送处理.因此,这些参数将作为指针传递,并且可能需要不安全的代码来进行操作.TlbImp:导入到d:\ zTemp\Microsoft.mshtml.dll的类型库

  1. 这些警告可以安全地被忽略吗?
  2. 这个DLL的预编译版本是否可以从microsoft站点下载?
  3. 我可以用我的应用程序分发这个dll吗?
  4. 将dll的引用添加到.NET 3.5项目时,我收到以下警告:

'Microsoft.mshtml.dll'或其依赖项之一需要.Net Framework的更高版本而不是项目中指定的版本...

既然这是一个警告,让我以任何方式添加引用,我仍然可以使用.NET 3.5中的.dll的某些功能吗?

谢谢

.net mshtml webbrowser-control internet-explorer-9

7
推荐指数
1
解决办法
7765
查看次数

在.net,winforms中显示用户控件后,我可以捕获的最后一个可能事件是什么?

正如标题所说,我正在寻找一个事件,以便在显示用户控件后捕获.

目前,我必须设置do-once变量并捕获Invalidated事件.

.net vb.net events user-controls winforms

6
推荐指数
1
解决办法
1753
查看次数

在Javascript中,'Object.create'和'new'之间的区别

我认为差异已经在我的脑海中点击,但我想确定.

他说,在道格拉斯克罗克福德页面上的JavaScript Prototypal Inheritance中

在原型系统中,对象从对象继承.但是,JavaScript缺少执行该操作的运算符.相反,它有一个新的运算符,这样new f()就会产生一个从f.prototype继承的新对象.

我真的不明白他在那句话中想说的是什么,所以我进行了一些测试.在我看来,关键的区别在于,如果我在纯原型系统中基于另一个对象创建一个对象,那么所有父父成员应该在新对象的原型上,而不是在新对象本身上.

这是测试:

var Person = function(name, age) {
        this.name = name;
        this.age = age;
}
Person.prototype.toString = function(){return this.name + ', ' + this.age};

// The old way...
var jim = new Person("Jim",13);
for (n in jim) {
    if (jim.hasOwnProperty(n)) {
        console.log(n);
     }
}
// This will output 'name' and 'age'.

// The pure way...
var tim = Object.create(new Person("Tim",14));
for (n in tim) {
    if (tim.hasOwnProperty(n)) {
        console.log(n);
     }
}
// This …
Run Code Online (Sandbox Code Playgroud)

javascript inheritance prototype prototypal-inheritance

6
推荐指数
1
解决办法
1797
查看次数

在.Net中完成的成本

(1)我已经阅读了很多关于IDisposable的问题,其中答案建议不要使用Finalize,除非你真的需要因为涉及的处理时间.
我没有看到的是这笔费用是多少以及支付的频率.每毫秒?第二?小时,天等

(2)此外,在我看来,如果一个物体可以处理,并不总是知道Finalize是否方便.例如,框架字体类.控件无法处理它,因为它不知道字体是否共享.字体通常是在设计时创建的,因此用户不会知道处理它,因此最终确定踢,以便在没有引用时最终摆脱它.这是一个正确的印象吗?

.net c# vb.net idisposable finalize

5
推荐指数
1
解决办法
884
查看次数

如何根据角度指定svg线性渐变

我想以一种精确复制CSS线性渐变行为的方式指定SVG线性渐变.例如,在CSS渐变中,您可以指定渐变开始和结束分别位于框的左上角和右下角.当框调整大小时,背景渐变会自动适应新大小.

在我的第一次尝试中,我通过指定角度并通过计算框大小的x1,y1,x2,y2坐标来复制带SVG的CSS线性渐变.但是如果调整框的大小,渐变的角度不会改变,也不再正确.(我必须重新计算所有坐标).

我的下一次尝试是使用变换来旋转渐变.这是一些代码:

<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
  <linearGradient id="g1" gradientUnits="userSpaceOnUse" 
      gradientTransform="rotate(-45 150 50)">
    <stop stop-color="#FF0000" offset="0"/>
    <stop stop-color="#00FF00" offset="0.5"/>
    <stop stop-color="#0000FF" offset="1"/>
  </linearGradient>
  <rect x="0" y="0" width="100%" height="100%" fill="url(#g1)" />
</svg>
Run Code Online (Sandbox Code Playgroud)

现在,这适用于一个大小的盒子(300,100),但你会发现我必须指定旋转中心的绝对值(150,50).

我可以用百分比来指定中心吗?最后,我希望渐变的角度适应盒子的尺寸.

css svg gradient css3

5
推荐指数
1
解决办法
3347
查看次数