小编pgh*_*ech的帖子

属性与字段:需要帮助掌握属性对字段的使用

首先,我已经阅读了关于这个主题的帖子列表,并且由于我对封装和字段修饰符(private,public..ect)的了解,我不觉得我已经掌握了属性.

我学习的C#的一个主要方面是使用封装在代码中保护数据的重要性.我认为'我理解这是因为使用修饰符的能力(私人,公共,内部,受保护).然而,在了解了属性之后,我不仅理解了属性的使用,而且还理解了C#中数据保护(我理解为封装)的整体重要性/能力.

更具体地说,当我到达C#中的属性时,我读过的所有内容都是你应该尝试使用它们代替字段,因为:

1)当您直接直接访问字段时,它们允许您更改数据类型.

2)它们为数据访问增加了一定程度的保护

然而,根据我的想法,我已经了解了字段修饰符的使用#2,在我看来属性只是生成了额外的代码,除非你有一些理由改变类型(#1) - 因为你是(或多或少)创建隐藏方法来访问字段而不是直接访问.

然后可以将整个修饰符添加到属性中,这进一步使我对属性访问数据的需要的理解变得复杂.

我已经阅读了不同作者关于"属性"的一些章节,并且没有人真正解释过对属性与字段与封装(以及良好的编程方法)的良好理解.

有人能解释一下:

1)为什么我想要使用属性而不是字段(特别是当它出现时我只是添加额外的代码

2)在跟踪其他人的代码时,有关识别属性的使用以及不将它们视为简单方法(除了get; set明显)之外的任何提示吗?

3)任何关于何时使用什么的良好编程方法的一般经验法则?

感谢和抱歉这篇长篇文章 - 我不想只问一个问题100x而不解释为什么我再问它.

c# encapsulation field properties

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

SQL问题,错误"无效的数据类型"

使用SQL 2008

所以我创建了一个User Defined类型:

CREATE TYPE dbo.ServiceType AS TABLE (
[TO_ZONE] varchar(30) NOT NULL,
[FROM_ZONE] varchar(30) NOT NULL,
[RATE] decimal(14,2) NOT NULL,
[SERVICE_TYPE] varchar(255) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它时,我得到错误"参数或变量@variableName具有无效的数据类型"

ALTER PROCEDURE [dbo].[ImportServiceTypeRates]

(@ServiceTypes dbo.ServiceType)  --I have tried it without the "dbo." as well
Run Code Online (Sandbox Code Playgroud)

更新

所以我在我的变量声明中添加了"READONLY"

@ServiceTypes dbo.ServiceType READONLY
Run Code Online (Sandbox Code Playgroud)

我现在得到错误"参数@Servicetype不能被声明为READONLY,因为它不是一个表值参数"?什么?

我认为"CREATE TYPE ServiceType as TABLE"是什么声明它?

我还在Types\User-Defined Table Types\dbo.ServiceType中显示

sql t-sql sql-server stored-procedures sql-server-2008

23
推荐指数
3
解决办法
3万
查看次数

C#:你可以在多个文件中拆分命名空间吗?

好吧,我找不到任何以前的帖子来回答我的问题所以....

我是C#的新手,并创建了一些Windows窗体,并注意到它创建了两个Program.csForm1.cs文件.

在两者中,它从我的程序"Contacts"的命名空间开始

namespace Contacts
{
   //code here
Run Code Online (Sandbox Code Playgroud)

这些是编译在一起的,还是由编译器单独看到?

c# namespaces

13
推荐指数
3
解决办法
2万
查看次数

System.Security.Cryptography.ProtectedData.Unprotect在某些情况下抛出一个无效的键错误

所以我试图利用System.Security.Cryptography.ProtectedData对象中的Unprotect方法并继续获取异常:

cryptographicexception key not valid for use in specified state
Run Code Online (Sandbox Code Playgroud)

我认为它与DataProtectionScope有关(但我不是100%).

如果我登录并在DEBUG模式下运行服务可执行文件,这种方法有效,这对我来说,它将在"currentuser"下运行.但是,如果我尝试运行在LocalSystem帐户下运行的实际Windows服务,它将无法抛出前面提到的异常.

方法:

ProtectedData.Unprotect(Byte[] byteArray, <some_password_salt>, DataProtectionScope.CurrentUser)
Run Code Online (Sandbox Code Playgroud)

DataProtectionScope Enum只有CurrentUser或LocalMachine作为选项.我不确定什么是解决这个问题的最佳选择.

我已经尝试将其设置为DataProtectionScope.LocalMachine,根据MSDN文章,在机器上运行的任何进程都应该能够取消保护数据.但事实并非如此.

c# cryptography

12
推荐指数
1
解决办法
1万
查看次数

方法组(C#In Depth) - 需要帮助更好地理解方法组是什么

所以我已经阅读了许多与"什么是方法组"相关的StackOverflow问题以及其他互联网文章,它们在底线都说同样的事情 - 方法组是"一组重载方法".

然而,阅读乔恩斯基特的"C#详解(第二版)",他说关于Lambda表达式的语境方法组下面的空话(章9.4.1)

更改的原因:简化泛型方法调用

类型推断在少数情况下发生.我们已经看到它适用于隐式类型数组,当您尝试将方法组隐式转换为委托类型时也需要它.当您使用方法组作为另一个方法的参数时发生转换时,这可能会特别令人困惑:调用方法的重载,方法组中方法的重载以及泛型方法涉及的可能性,这组潜在的转换可能是巨大的."

这两个方法组都不只是分配一组重载方法,或者他说你实际上可以创建一个保留整个方法组的委托.或者完全不同的东西,我不太了解.

有人能解释一下他说的可能吗?

谢谢,

c#

10
推荐指数
1
解决办法
3662
查看次数

有没有办法添加Umbraco自定义数据类型,它基本上是一组现有数据类型?

在许多不同的文档类型上,我必须添加相同的3个本机Umbraco数据类型

  1. 内容选择器
  2. TextString
  3. TextString

有人建议我看看是否有办法创建一个新的自定义数据类型,基本上将这3种数据类型包装成一个新的数据类型.

我查看了nibble.be的网站,看到有几种不同的方法可以创建自定义数据类型(使用usercontrol包装或3类方法).但是,我不确定用于对现有数据类型进行分组的自定义数据类型是否是正确的路由.

首先,我们在Umbraco旁边使用MVC,大量使用Razor视图.由于文档类型属性别名用于从内容页面获取Umbraco的值,因此我看不出这是如何实现的,或者如何获取具有嵌入数据类型的自定义数据类型的属性值.

是否有工作方式或更好的方法来完成此解决方案,因为必须在所需的任何文档类型上添加相同的字段?我虽然关于分层方法,文档类型父类只有这3种数据类型(内容选择器和2条文本字符串),但这意味着必须在这种父文档类型下放置页面需要的任何文档类型,只是为了继承事实这些属性组.

umbraco

10
推荐指数
1
解决办法
1万
查看次数

为什么魔术会锁定System.Object的实例而不是锁定特定的实例类型?

我一直在学习锁定线程,我还没有找到解释为什么创建一个典型的System.Object,锁定它并执行锁定期间所需的任何操作提供线程安全?

object obj = new object()
lock (obj) {
  //code here
}
Run Code Online (Sandbox Code Playgroud)

起初我以为它只是被用作示例中的占位符,并且意味着要与您正在处理的类型进行交换.但我发现Dennis Phillips指出的例子似乎与实际使用Object的实例没什么不同.

因此,举一个需要更新私有字典的例子,锁定System.Object的实例做什么来提供线程安全而不是实际锁定字典(我知道在这种情况下锁定字典可能会出现案例同步问题)?如果字典是公开的怎么办?

//what if this was public?
private Dictionary<string, string> someDict = new Dictionary<string, string>();

var obj = new Object();
lock (obj) {
  //do something with the dictionary
}
Run Code Online (Sandbox Code Playgroud)

c# multithreading locking

9
推荐指数
2
解决办法
620
查看次数

Web.Config中的Log4Net部分生成错误

所以我试图在我的Web .NET 4.0应用程序中设置Log4Net.我已将正确的.dll添加到我的项目中,并将以下内容作为启动器添加到我的Web.Config文件中:

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
<root>
  <level value="DEBUG" />
  <appender-ref ref="RollingLogFileAppender" />
</root>
</configSections>
 <log4net debug="true">
 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file value="C:\\TestProj\\TestLog.txt" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%-5p %d %5rms %-22.22c{1} %-18.18M - %m%n" />
  </layout>
 </appender>
Run Code Online (Sandbox Code Playgroud)

但是,如果我将"log4net"部分附加到Web.Config,我将收到错误消息

无法在Web服务器上启动调试.有关常见配置问题请参阅帮助.....

确保服务器正常运行.验证web.config中没有语法错误........

注意 我可以删除本节的所有内部结构,只留下声明:

<log4net></log4net>
Run Code Online (Sandbox Code Playgroud)

我仍然会得到同样的错误.

有人可以给我一些关于如何追踪这个错误的指示吗?

log4net c#-4.0 log4net-configuration

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

如果使用jQuery隐藏它,我无法点击ASP:Button?

我找到了StackOverFlow的答案和其他资源,说你可以点击一个隐藏的ASP:按钮与jQuery by

$("#<%=HiddenButton.ClientID%>").click();
Run Code Online (Sandbox Code Playgroud)

要么

$("#<%=HiddenButton.ClientID%>").trigger("click");
Run Code Online (Sandbox Code Playgroud)

但是,这些都不适用于我,除非按钮是Visible ="true"

这是按钮:

<asp:Button ID="loadCustomerContacts" runat="server" OnClick="loadCustomerContacts_Click" visible="false" />"
Run Code Online (Sandbox Code Playgroud)

asp.net webforms

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

引用Powershell数组索引在使用string引用时会产生意外结果

我试图找出如果你有以下情况发生的原因

$arr = @("Filename1", "Filename2")
for($i =0; $i -le $arr.Length -1; $i++) {

   write-host ".\"$arr[$i]
   write-host ".\$arr[$i]"
   write-host $arr[$i] 
}
Run Code Online (Sandbox Code Playgroud)

因此只需一个循环即可生成:

".\ Filename1"
".\ Filename1 Filename2[0]"
"Filename1"
Run Code Online (Sandbox Code Playgroud)

只是引用数组[index]将产生正确的值,但如果我与字符串连接,它会在字符串和值之间放置一个空格.当放在字符串中时,我假设它正在转储整个内容,因为它正在评估$ array,然后评估$ i结束

".\ filename1 filename2 [索引号]"

但是,如果我将单个值分配给一个单独的变量并将其与一个字符串连接起来就没有空格了?这是为什么:

例:

 $name = $arr[$i]
 write-host ".\$name"
Run Code Online (Sandbox Code Playgroud)

output =".\ filename1"

哪个是对的.

powershell

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