C#开发一应用的总结

简介: 要搭建测试环境。 Webbrowser使用方面: 重新加载一页面后,要获取新的内容要使用重新使用browser.Document获取; HtmlElement的GetElementsByTagName(html标记)是HtmlElement中包括的所有标记的集合,如果相同元素有嵌套时要注意。

要搭建测试环境。
Webbrowser使用方面:
重新加载一页面后,要获取新的内容要使用重新使用browser.Document获取;

HtmlElement的GetElementsByTagName(html标记)是HtmlElement中包括的所有标记的集合,如果相同元素有嵌套时要注意。如:
<table>
<tr>
     <td>1</td>
</tr>
<tr>
<td>
        <table>
         <tr>
         <td>2</td>
         </tr><tr>
         <td>3</td>
        </tr>
       </table>
</td>
</tr>
</table>

如果获取最外层table节点为HtmlElement  he,此时使用he.GetElementsByTagName(“tr”),则包含4个元素:

0:
<tr>
<td>1</td>
</tr>
1:
<tr>
<td>
<table>
<tr>
<td>2</td>
</tr><tr>
<td>3</td>
</tr>
</table>
</td>
</tr>
2:
<tr>
<td>2</td>
</tr>
3:
<tr>
<td>3</td>
</tr>

如果要获取class属性,要使用HtmlElement he;he.getAttribute(“className”); 或he.getAttribute(“classname”); 即不区分大小写

下拉列表设置属性:
he.SetAttribute("value", "2013-1-1");  
he.RaiseEvent("onChange");    //触发onChange事件,如果在后续代码中使用he.invokeScript(js名称);这个可以不用写           


其它:

Dictionary使用中如果使用foreach travel时不能进行更改(增加、删除、修改),否则会报错:
Collection was modified; enumeration operation may not execute.
遍历并修改:

#region Dictionary Travel modify
public static void mainTest()
{
    Dictionary<String, Int32> dic = new Dictionary<String, Int32>();
    dic.Add("1", 1);
    dic.Add("2", 2);
    dic.Add("3", 3);
    foreachTravelDic(dic);
    modifyDic1(dic);
    foreachTravelDic(dic);
    modifyDic2(dic);
    foreachTravelDic(dic);
    Console.ReadKey();
}


public static void foreachTravelDic(Dictionary<String, Int32> dic)
{
    foreach (KeyValuePair<String, Int32> kvp in dic)
    {
        Console.WriteLine(String.Format("Key:{0}; Value:{1}", kvp.Key, kvp.Value));
        //dic[kvp.Key] = 2;//此操作会报错
    }
}

 

private static void modifyDic2(Dictionary<String, Int32> dic)
{
    String[] keyStr = dic.Keys.ToArray<String>();
    for (int i = 0; i < keyStr.Length; i++)
    {
        dic[keyStr[i]] = dic[keyStr[i]] + 22;
    }

}


private static void modifyDic1(Dictionary<String, Int32> dic)
{
    int dicCount = dic.Keys.Count;
    String[] strKey = new String[dicCount];
    dic.Keys.CopyTo(strKey, 0);//支持.net2.0
    for (int i = 0; i < strKey.Length; i++)
    {
        if (dic.ContainsKey(strKey[i]))
        {
            dic[strKey[i]] = dic[strKey[i]] + 11;
        }
    }
}
#endregion
output:
image

补充:
foreach在travel Dictionary时报错的原因:
http://www.cnblogs.com/dudu/archive/2006/07/31/464391.html
在执行foreach时,其他线程对_dictionary进行了Add操作,改变了_dictionary中的数据,从而产生了上述的异常信息。

     那为什么会产生这样的异常信息呢?
     foreach实际上执行的代码是:   

Dictionary<int, int>.Enumerator enumerator = _dictionary.GetEnumerator(); 
try

while (enumerator.MoveNext())  
   { 
    } 

finally

   IDisposable d = enumerator as IDisposable; 
if (d != null) d.Dispose(); 
}

     通过Reflector查看Dictionary<TKey, TValue>.Enumerator.MoveNext()源代码,我们会发现开始处有这样的代码:

if (this.version != this.dictionary.version)
      {
            ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
      }

     而异常就是在这里发生的,因为Add操作时改变了Dictionary的version,通过查看Insert(TKey key, TValue value, bool add)的源代码会看出。
     我觉得Dictionary<TKey, TValue>应该提供一个方法,可以设置在MoveNext时是否进行版本检查,因为有时在foreach操作时,可能并不关心Dictionary中的数据是否被修改,我遇到的就是这样的情况,现在由于这个问题而不能使用foreach,而只能采取其他方法遍历Dictionary<TKey, TValue>中的数据。


Dictionary类型在作为参数传递时:
public static void Main(String[] args) {
           #region test Dic
            IDictionary<String,String> sumDic=new Dictionary<String,String>();
            IDictionary<String, String> secDic = new Dictionary<String, String>();
            sumDic.Add("ak","av");
            sumDic.Add("bk", "bv");
            sumDic.Add("ck", "cv");
            sumDic.Add("dk", "dv");
            sumDic.Add("ek", "ev");

            secDic = testDic(sumDic);//引用传递
            foreach (KeyValuePair<String, String> kvp in sumDic)
            {
                Console.WriteLine(String.Format("{0}====>{1}",kvp.Key,kvp.Value));
            }
            Console.WriteLine("----------------------------");
            foreach (KeyValuePair<String, String> kvp in secDic)
            {
                Console.WriteLine(String.Format("{0}====>{1}", kvp.Key, kvp.Value));
            }
//            output:
//            ak====>av
//            bk====>bv
//            ck====>cv
//            ek====>ev
//----------------------------
//            dk====>dv

            #endregion
            Console.ReadKey();

        }

private static IDictionary<String, String> testDic(IDictionary<String, String> sumDic)
  {
      IDictionary<String, String> secDic = new Dictionary<String, String>();
      String[] keysStr=sumDic.Keys.ToArray<String>();

      for (int i = 0; i < keysStr.Length; i++)
      {
          if (sumDic[keysStr[i]].Equals("dv"))
          {
              secDic.Add(keysStr[i], sumDic[keysStr[i]]);
              sumDic.Remove(keysStr[i]);
          }
      }

      return secDic;
  }


出现的问题:
1、因业务需要更改了几个关键方法,程序没有报异常,但是有一个方法一直没有执行,一直很困惑
由于开发环境和生产环境分离,也无法在现网调试,只能分析代码,最后发现问题就在改的方法上,中间的过渡方法执行了另一个操作,但是没有将值返回,导致向上层传递了空Dictionary,虽然没有报错,但不满足另一个方法的执行条件。。。。

 

2、日志输出时忽略了一些关键信息,需先规划好要输入哪些必要信息;


3、IDictionary<String, int[]>  数组作为dic的value时出现的问题:

数组是引用类型,如果在第二次使用时没有实始化就重新使用,会影响到以前的值:
有问题的:

       public static void TestDicArray() {
            Dictionary<String, int[]> dic = new Dictionary<String, int[]>();

          int[] valueArray=new int[2];
          valueArray[0] = 1;
          valueArray[1] = 1;

          dic.Add("test1",valueArray);
          //valueArray = new int[2];
          valueArray[0] = 2;
          valueArray[1] = 2;

          dic.Add("test2", valueArray);

          //valueArray = new int[2];
          valueArray[0] = 3;
          valueArray[1] = 3;

          dic.Add("test3", valueArray);

         // valueArray = new int[2];
          valueArray[0] = 4;
          valueArray[1] = 4;

          dic.Add("test4", valueArray);

         // valueArray = new int[2];
          valueArray[0] = 5;
          valueArray[1] = 5;

          dic.Add("test5", valueArray);



          foreach (KeyValuePair<String,int[]> kvp in dic)
          {

              Console.WriteLine(kvp.Key);
              int[] tempInt = kvp.Value;
              Console.WriteLine(tempInt[0]+"\t"+tempInt[1]);

              Console.WriteLine(dic[kvp.Key][0]+"\t"+dic[kvp.Key][1]);

          }
        
        
        }


image

正确的:

       public static void TestDicArray() {
            Dictionary<String, int[]> dic = new Dictionary<String, int[]>();
 
          int[] valueArray=new int[2];
          valueArray[0] = 1;
          valueArray[1] = 1;
 
          dic.Add("test1",valueArray);
          valueArray = new int[2];
          valueArray[0] = 2;
          valueArray[1] = 2;
 
          dic.Add("test2", valueArray);
 
          valueArray = new int[2];
          valueArray[0] = 3;
          valueArray[1] = 3;
 
          dic.Add("test3", valueArray);
 
          valueArray = new int[2];
          valueArray[0] = 4;
          valueArray[1] = 4;
 
          dic.Add("test4", valueArray);
 
          valueArray = new int[2];
          valueArray[0] = 5;
          valueArray[1] = 5;
 
          dic.Add("test5", valueArray);
 
 
 
          foreach (KeyValuePair<String,int[]> kvp in dic)
          {
 
              Console.WriteLine(kvp.Key);
              int[] tempInt = kvp.Value;
              Console.WriteLine(tempInt[0]+"\t"+tempInt[1]);
 
              Console.WriteLine(dic[kvp.Key][0]+"\t"+dic[kvp.Key][1]);
 
          }
        
        
        }


OutPut:

image

                    //input value attribute;InnerText is null
                    HtmlElementCollection hecSelects = hd.GetElementsByTagName("input");
                    foreach (HtmlElement heSelect in hecSelects)
                    {
                        showMsgInText("value:"+heSelect.GetAttribute("value"));
                        showMsgInText("InnerText:" + heSelect.InnerText);
                    }
相关文章
|
26天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
64 12
|
2月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
131 51
|
2月前
|
存储 安全 物联网
C# 在物联网 (IoT) 应用中的应用
本文介绍了C#在物联网(IoT)应用中的应用,涵盖基础概念、优势、常见问题及其解决方法。重点讨论了网络通信、数据处理和安全问题,并提供了相应的代码示例,旨在帮助开发者更好地利用C#进行IoT开发。
132 3
|
2月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
106 1
|
2月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
78 2
|
2月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
68 1
|
2月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
46 3
|
2月前
|
编译器 C#
c# - 运算符<<不能应用于long和long类型的操作数
在C#中,左移运算符的第二个操作数必须是 `int`类型,因此需要将 `long`类型的位移计数显式转换为 `int`类型。这种转换需要注意数据丢失和负值处理的问题。通过本文的详细说明和示例代码,相信可以帮助你在实际开发中正确使用左移运算符。
78 1
|
2月前
|
C# Python
使用wxpython开发跨平台桌面应用,对wxpython控件实现类似C#扩展函数处理的探究
【10月更文挑战第30天】使用 `wxPython` 开发跨平台桌面应用时,可以通过创建辅助类来模拟 C# 扩展函数的功能。具体步骤包括:1. 创建辅助类 `WxWidgetHelpers`;2. 在该类中定义静态方法,如 `set_button_color`;3. 在应用中调用这些方法。这种方法提高了代码的可读性和可维护性,无需修改 `wxPython` 库即可为控件添加自定义功能。但需要注意显式调用方法和避免命名冲突。
|
3月前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
52 1