воскресенье, 16 мая 2010 г.

1001-я причина, почему документацию лучше читать на английском языке (for russians)

Почитываю документацию по C#, с целью уменьшения пробелов в знаниях и некоторых тонкостях.
Фраза из MSDN:
It is not possible to modify an abstract class with the sealed (C# Reference) modifier because the two modifers have opposite meanings. The sealed modifier prevents a class from being inherited and the abstract modifier requires a class to be inherited.

Перевод из MSDN:
Абстрактный класс с модификатором sealed (Справочник по C#) изменить нельзя, поскольку sealed предотвращает наследование класса

Вопрос: что имел в виду переводчик в словах "изменить нельзя". Изменить количество свойств/полей/методов и т.д. нельзя? Можно.

Так вот, следует переводить так:
Использование модификатора sealed с классом, помеченным модификатором abstract, невозможно из-за того что данные модификаторы имеют противоположный смысл. Модификатор sealed запрещает наследование данного класса, а abstract требует, чтобы данный класс был обязательно унаследован.

По теме: безусловно, подобных смысловых ошибок достаточно много в переводах. Просто часто встречаются люди, которые считают, что раз они русские, то и должны читать документацию на русском, и как это можно, читая на английском, гораздо лучше понимать суть документации. Лишний повод задуматься.

Что касается класса, то как раз класс? объявленный как static, внутри сборки превращается в одновременно abstract и sealed. Кто не верит - ildasm в помощь.

    static class Point
    {
        static int m_x1;
        static int x1 { get { return m_x1; } }
        static int x2;
        static Point()
        {  }
    }
Выглядит следующим образом:

воскресенье, 28 февраля 2010 г.

Getting private fields values using reflection

We can get the private variables values inspite the ones are private. It is not a new idea, just for somebody who does not know

using System.Reflection;
class PrivateFieldsClass
{
    private int myPrivateField = 0;
}

class Program
{
    static void Main(string[] args)
    {
        PrivateFieldsClass myObject = new PrivateFieldsClass();
        FieldInfo fieldInfo = myObject.GetType().GetField("myPrivateField", BindingFlags.Instance BindingFlags.NonPublic);
        fieldInfo.SetValue(myObject, 42);

    }
}
But it works only if you know name of  a variable

вторник, 19 января 2010 г.

Telerik ComboBox:- creating custom style

Recently I had a task to edit telerik ComboBox. The problem was that after increasing height of ComboBox, the size of one exeedes sprite area size, and it was needed to style control according to site color scheme.

Assume that we have a page with RadComboBox on it.
First of all set EnabledEmbeddedSkins property to false.
  • Create in App_Themes, a folder named MySkin.
  • Copy from ..\\RadControls for ASP.NET AJAX Q2 2009\Skins\Default a file ComboBox.Default.css and folder ComboBox with the sprites inside it to ..\App_Themes\MySkin. Now we have the next structure:
  • Replace file name ComboBox.Default.css with ComboBox.MySkin.css
  • Replace file name ComboBox.Default.css with ComboBox.MySkin.css
  • Inside style file replace all _Default, with _MySkin. For example:
    .RadComboBox_Default *
    {
     margin: 0;
     padding: 0;
    }
    .RadComboBox_Default,
    .RadComboBox_Default .rcbInput,
    .RadComboBoxDropDown_Default
    {
     font: 12px "Segoe UI", Arial, sans-serif;
     color: #333;
     text-align: left;
    }
     
    And after replacing:
    .RadComboBox_MySkin *
    {
     margin: 0;
     padding: 0;
    }
    
    .RadComboBox_MySkin,
    .RadComboBox_MySkin .rcbInput,
    .RadComboBoxDropDown_MySkin
    {
     font: 12px "Segoe UI", Arial, sans-serif;
     color: #333;
     text-align: left;
    }
    
  • Bind style to the page:
  • Write Combobox skink as skin="MySkin"
  • Done!

суббота, 9 января 2010 г.

Проблема с путями к js-скриптам на Master Page

На Master Page были прописаны пути к *.js файлам. Все работало до того момента, пока не появились контент-страницы, использующие эту Master Page и лежащие во вложенных директориях. Так вот, эти контент-страницы просто не видели .*js файлы.

Одним из решений оказалось удалить пути к скриптам с Master Page, а в событии Page_Load прописать следующее:

protected void Page_Load(object sender, EventArgs e)
{
    HtmlGenericControl js = new HtmlGenericControl();
    js.TagName = "script";
    js.Attributes.Add("type", "text/javascript");
    js.Attributes.Add("language", "javascript");
    js.Attributes.Add("src", ResolveUrl("~js/myscript.js"));
    this.Page.Header.Controls.Add(js);
}

Кто какие решения еще предложит?