在清洗一些代码,今天是别人写的,我是从改变访问修饰符Public来Private上一类变量/成员/场.我期待一长串编译器错误,我用它来"重构/返工/审查"使用此变量的代码.想象一下,当我没有收到任何错误时,我感到惊讶.在审阅之后,事实证明,Class的另一个实例可以访问Class中声明的另一个实例的私有成员.完全未被发现.
这是正常的吗?我从一开始就在.NET中编写代码,从未遇到过这个问题,也没有读过它.我之前可能偶然发现它,但只是"模糊地注意到"并继续前进.任何人都可以向我解释这个行为吗?我想知道"为什么"我能做到这一点.请解释一下,不要只告诉我规则.难道我做错了什么?我在C#和VB.NET中都发现了这种行为.代码似乎利用了访问私有变量的能力.缺点是程序员创造了一大块Spaghetti.
此致
Class Jack
Private _int As Integer
End Class
Class Foo
Public Property Value() As Integer
Get
Return _int
End Get
Set(ByVal value As Integer)
_int = value * 2
End Set
End Property
Private _int As Integer
Private _foo As Foo
Private _jack As Jack
Private _fred As Fred
Public Sub SetPrivate()
_foo = New Foo
_foo.Value = 4 'what you would expect to do because _int is private
_foo._int …Run Code Online (Sandbox Code Playgroud) 只是想问一个关于人们用于"资源字典(WPF)"项目的命名约定的一般性问题.
在我继承的项目中,我有各种各样的命名约定的资源字典.因此,我正在寻找管理资源词典的建议.
请从任何答案中排除Themes文件夹和那些资源词典.
由于所有关于花哨,超级,巨大和哇哇,哇哇,哇哇,工具提示的噪音,我找不到答案.
我只需要一个简单的样式设置TextWrapping="Wrap"并允许我设置宽度.
一个复制现有/默认样式,但只是单词换行.
显然,这不起作用.
为什么???????
我不想只是为了调用我的函数来做这一切:
Dim x as new Object()
x.Method()
Run Code Online (Sandbox Code Playgroud)
当我可以在一个行中时,为什么必须用两行来完成.
我需要帮助设置透明图像到剪贴板.我一直得到"处理无效".基本上,我需要一个"第二组眼睛"来查看以下代码.(ftp://missico.net/ImageVisualizer.zip上的完整工作项目.)
这是一个图像Debug Visualizer类库,但我使包含的项目作为可执行文件运行进行测试.(请注意,窗口是工具箱窗口,任务栏中的显示设置为false.)我厌倦了必须在工具箱窗口上执行屏幕捕获,使用图像编辑器打开屏幕捕获,然后删除添加的背景,因为它是一个屏幕截图.所以我想我会很快将透明图像放到剪贴板上.好吧,问题是......没有对Clipboard.SetImage的透明度支持.谷歌救援......并不完全.
这就是我到目前为止所拥有的.我从众多消息来源中撤出.请参阅主要参考的代码.我的问题是使用CF_DIBV5时的"无效句柄".我需要使用BITMAPV5HEADER和CreateDIBitmap吗?
GDI/GDI + Wizards的任何帮助将不胜感激.
public static void SetClipboardData(Bitmap bitmap, IntPtr hDC) {
const uint SRCCOPY = 0x00CC0020;
const int CF_DIBV5 = 17;
const int CF_BITMAP = 2;
//'reference
//'http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/816a35f6-9530-442b-9647-e856602cc0e2
IntPtr memDC = CreateCompatibleDC(hDC);
IntPtr memBM = CreateCompatibleBitmap(hDC, bitmap.Width, bitmap.Height);
SelectObject(memDC, memBM);
using (Graphics g = Graphics.FromImage(bitmap)) {
IntPtr hBitmapDC = g.GetHdc();
IntPtr hBitmap = bitmap.GetHbitmap();
SelectObject(hBitmapDC, hBitmap);
BitBlt(memDC, 0, 0, bitmap.Width, bitmap.Height, hBitmapDC, 0, 0, SRCCOPY);
if (!OpenClipboard(IntPtr.Zero)) {
throw new System.Runtime.InteropServices.ExternalException("Could not open Clipboard", …Run Code Online (Sandbox Code Playgroud) 我有一个C#windows窗体应用程序.我当前设置它的方式,当Form1_Load()运行时,它检查恢复的未保存数据,如果找到一些,它会提示用户是否要打开该数据.当程序运行时,它可以正常工作但是消息框会立即显示,并且主程序表单(Form1)在用户单击是或否之后才会显示.我想首先弹出Form1然后弹出消息框提示.
现在,在我在Form中创建一个计时器之前解决这个问题,在Form1_Load()方法中启动计时器,然后在第一个Timer Tick事件中执行检查和用户提示.这种技术解决了这个问题,但似乎可能有更好的方法.
你们有更好的想法吗?
编辑:我想我也使用后台工作人员做类似的事情.通过调用方法返回到表单线程所有麻烦似乎有点傻了,所有的垃圾只是让它延迟了几毫秒!
我正在使用OleDB DataReader从我的excel文件中获取数据(但是这个问题也出现在DataTable.Fill中).问题是我有一个应该返回字符串的列.一切都很好并且工作但是最近出现了一个问题,因为列的单元格具有不同的格式.有些是数字,有些是文本.当我使用dataReader.GetSchema()检查时,它显示有问题的列被推断为类型System.String.这个问题是所有非文本单元格都立即设置为null.
有没有办法向读者建议该列应该只是将列解析为System.Object而不是将其推断为System.String并转储所有非字符串单元格?
我正在使用的连接字符串是:
string connString ="Provider = Microsoft.Jet.OLEDB.4.0;" +"数据源="+ filePath +";" +"扩展属性= Excel 8.0;";
而代码是:
using ( OleDbConnection connection = new OleDbConnection( connString ) )
{
connection.Open();
foreach ( string worksheetName in worksheetNames )
{
using ( OleDbCommand command =
new OleDbCommand( "SELECT * FROM [" + worksheetName + "]", connection ) )
{
TEntity entity;
using ( OleDbDataReader dataReader = command.ExecuteReader() )
{
while ( dataReader.Read() )
{
entity = GetDataFromDataTable( dataReader );
if ( entity != null …Run Code Online (Sandbox Code Playgroud) 我在使用结构和函数时遇到了一些麻烦,这些函数在VB.NET中返回Nothing.
让我试着用这段代码解释一下:
Public Class Form1
Structure Test
Dim field1 As String
End Structure
Private Function Foo() As Test
Return Nothing
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim st As Test = Foo()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
在前面的代码中,当我返回Nothing作为Foo函数的结果时,我希望st是Nothing.但这不是发生的事情.
然后我在MSDN文档中找到:
为变量赋值Nothing将其设置为其声明类型的默认值.如果该类型包含变量成员,则它们都设置为其默认值.
所以我发现当我为结构分配Nothing时,它的所有成员都被设置为默认值,而不是结构本身.
另外,我试图通过声明:使st成为Nullable类型:
Dim st As Nullable(Of Test) = Foo()
Run Code Online (Sandbox Code Playgroud)
但是,我仍然无法使用以下方法检查st是否为Nothing:
If st Is Nothing Then
Run Code Online (Sandbox Code Playgroud)
要么
If st.Equals(Nothing) Then
Run Code Online (Sandbox Code Playgroud)
那么,问题:
1 - 是否可以为结构而不是其成员分配 …
在我的视图模型和模型中,我有一个带有签名的方法bool IsPropertyReadOnly(string propertyName).此方法确定当前登录的用户是否可以编辑属性值.一些用户将能够编辑属性值,而其他大多数用户将具有只读访问权限.
而不是创建一个属性返回每个模型的属性的只读状态的,我要的结果绑定IsPropertyReadOny到TextBox.IsReadOnly属性.
这就是我设想的语法:
<TextBox Text="{Binding Address, Mode=TwoWay}"
IsReadOnly="{Binding MethodName=IsPropertyReadOnly MethodParameter=Address}"
/>
Run Code Online (Sandbox Code Playgroud)
在DataContext包含视图模型,所以基本上我需要绑定IsReadOnly到调用的结果((Class)this.DataContext).IsPropertyReadOnly("Address")
使用an时有很多文档ObjectDataProvider,但是对象数据提供程序创建了一个不是我想要的新对象实例.而且,要使用现有实例,我必须在代码隐藏中进行赋值.再一次,不是我想做的.
从我的研究来看,似乎是一种继承Binding或MarkupExtension更适合我需求的解决方案.
任何帮助将不胜感激.
如何可靠地确定ControlTemplateWPF应用程序中是否使用了以下内容?文件名是'CheckBoxTemplates.xaml',并且与主应用程序位于不同的程序集中.注意,当我搜索文件名和资源键时没有结果.此外,在解决方案中搜索资源键是不可靠的.特别是,当有五个资源字典文件包含相同的密钥时.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna">
<Style x:Key="invertedCheckBox"
TargetType="CheckBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox"
...
Run Code Online (Sandbox Code Playgroud)
更多信息
user2250152应答者对于上述XAML是正确的.它无法可靠地确定是否正在使用样式.我这样说是因为当我将这种技术用于另一种风格时,我发现了五个包含相同密钥的资源字典文件.因此,我们必须考虑如何可靠地确定使用重复键定义的样式.
.net ×5
wpf ×4
vb.net ×2
winforms ×2
xaml ×2
c# ×1
class-design ×1
clipboard ×1
constructor ×1
data-binding ×1
excel ×1
form-load ×1
gdi ×1
gdi+ ×1
method-call ×1
methods ×1
nothing ×1
oledb ×1
structure ×1
styles ×1
tooltip ×1
transparency ×1