• Свойства(автосвойства) в c# это поведение или состояние объекта?

    @wol2for
    Определимся с терминологией:


    1. Объект обладает состояние и поведение (Гради Буч)

      Подчеркну еще раз, объект. Не тип, не класс(класс только описывает будущий объект), а объект.


    2. Состояние объекта характеризуется перечнем (обычно статическим) всех свойств данного объекта и текущими (обычно динамическими) значениями каждого из этих свойств. (Гради Буч)




    3. Поведение - это то, как объект действует и реагирует; поведение выражается в терминах состояния объекта и передачи сообщений. Иными словами, поведение объекта - это его наблюдаемая и проверяемая извне
      деятельность
      . (Гради Буч)




    4. Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного поля. Свойства можно использовать, как если бы они были членами общих данных, но фактически они представляют собой специальные методы, называемые методами доступа. Это позволяет легко получать доступ к данным и помогает повысить безопасность и гибкость методов. (Свойства MSDN)




    5. Свойства позволяют обращаться к методу в исходном тексте программы, используя упрощенный синтаксис. (Рихтер, глава 9, стр. 204 по книге)




    6. Осторожный подход к определению свойств. Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами. Это по рождает массу заблуждений и непонимания. Столкнувшись с кодом, обращающимся к полю, разработчик привычно предполагает наличие массы условий, которые просто не всегда верны, если речь идет о свойстве. (Рихтер, глава 9, стр. 204 по книге)



    А теперь разберемся, что к чему.
    Пример из того же Рихтера глава 9.
    public sealed class Employee 
        {
        private String m_Name;   // Это состояние 
        private Int32  m_Age;    // Это состояние 
        
        public String GetName() // Это поведение  
        {
           return(m_Name);
        }
        public void SetName(String value) // Это поведение
        {
           m_Name = value;
        }


    Равносилен этому примеру из той же главы (Рихтер об это сам и говорит):
    public sealed class Employee 
        {
           private String m_Name; // Это состояние 
           private Int32  m_Age; // Это состояние 
        
           public String Name // Это поведение  
           {
             get { return(m_Name); }
             set { m_Name = value; }
           }  
        }


    Тут уже становится ясно что свойства это механизм доступа к закрытым полям, который осуществляется через методы. А значит, что Свойства это поведение. Рихтер как раз и критикует свойства, за то что они похожи на поля, а на самом деле это методы (которые предоставляет доступ к закрытым полям). Рихтер вообще предлагает убрать свойства, дабы избежать путаницы (в книге он рассматривает проблему со свойствами с другой стороны, но это еще одна грань проблем связаны с свойствами).

    И, по-поводу свойства в интерфейсах, они помечаются как abstract, и выглядят примерно так:
    public abstract String GetName();
    public abstract void SetName(String value);

    Это просто голые методы без реализации. Они не могут быть ни состояние, ни поведение, так как только ОБЪЕКТ может иметь состояние и поведение.

    Экземпляр интерфейса и абстрактного класса нельзя создать, по этому к ним применение понятия состояния и поведения невозможно.
    Ответ написан
  • Сжатие(Compress) в ASP.NET MVC?

    DenomikoN
    @DenomikoN
    .NET Developer
    1. Разница в том, на каком этапе будет добавляться фильтр сжатия + как Вы отметили во втором варианте вы сами контролируете какие Actions будут поподать под сжатие
    2. Нет разницы
    3. Почти, целевые mime-types будут браться из конфига IIS - он может отличаться от указанного в пункте #3
    4. Не забывайте что сжатие потребляет ресурс - CPU, но уменьшает объем трафика. Конкретное решение зависит от ваших требований и проблемы, которую Вы пытаетесь решить. Вариант №1 всегда проигрывает №2 в гибкости. Только вариант №3 позволяет сжимать статику. Если цель сжимать всё - используйте №2 (регестрировать глобально) и/или №3. Если отдельные Actions которые возвращают большие страницы - №2.
    Ответ написан
  • Прозрачная шапка для сайта?

    @Robert_blk
    JS-программист
    Где TweenMax.to замените на свои действия
    $(this).scroll(function() {
    
          if ($(this).width() < 992 ) {
            var offsetHeight = $(this).scrollTop();
    
            if ( offsetHeight > 50 ) {
              TweenMax.to( $('header'), 0.3, {css:{backgroundColor: '#fff'}, ease: Back.easeIn} );
            }
            else {
              TweenMax.to( $('header'), 0.3, {css:{backgroundColor: 'transparent'}, ease: Back.easeIn} );
            }
          }
      });
    Ответ написан
  • Прозрачная шапка для сайта?

    @campus1
    Сделано это с помощью Jquery. К nav добавляется класс navScroll с белым беком.
    Вот этот скрипт делает это:
    $(function() {
        $(window).scroll(function() {
            var scroll = $(window).scrollTop() + 90;
            var currentArea = $("section").filter(function() {
            	return scroll <= $(this).offset().top + $(this).height();
            });
            $(".nav a").removeClass("selected");
            $(".nav a[href=#" + currentArea.attr("id") + "]").addClass("selected");
    
            if ($(window).scrollTop() > 100) {
                $('nav').addClass("navScroll");
                $('img.logo').addClass("logoScroll");
                $('div.menu').addClass("menuScroll");
            } else if ($(window).scrollTop() < 100 ) {
                $('nav').removeClass("navScroll");
                $('img.logo').removeClass("logoScroll");
                $('div.menu').removeClass("menuScroll");
            }
        });
    });


    P.S Всегда смотрите dev tools, найдете все что хотите)
    Ответ написан
  • Добавить картинку в sql таблицу?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    OPENROWSET.
    Решение автора вопроса:
    UPDATE
    UPDATE PictureProduct 
    SET Picture = 
          (SELECT * FROM OPENROWSET(BULK N'C:\1.jpg', SINGLE_BLOB) AS image)
    WHERE Id = 6

    INSERT
    INSERT INTO PictureProduct (Id, IdProduct, Picture) 
    SELECT 8, 4, BulkColumn 
    FROM Openrowset( Bulk 'C:\2.jpeg', Single_Blob) as image
    Ответ написан
  • Linq, связь многие ко многим в EF?

    DarkRaven
    @DarkRaven
    разработка программного обеспечения
    Вообще, тут несколько вариантов. Мы можете руками добавить нужную связывающую таблицу в контекст.

    Или же сделать примерно так:

    var data = db.Products.Include("Repositories");
    var values = new List<ProductWithRepoDTO>();
    
    foreach(var record in data)
    {
        var reposArray = record.Repositories.Select(x=>x.Name).ToArray();
        var reposString = string.Join(",", reposArray);
        
        values.Add(new ProductWithRepoDTO
        {
            Id = record.Id,
            Name = record.Name,
            Cound = record.Count,
            Price = record.Price,
            Repository = reposString 
        });        
    }
    //дальше работать с values


    Второй подход на мой взгляд правильнее, т.к. вы уже работаете не доменной моделью, а с моделью представления, которая уже содержит удобные для отображения данные.
    Ответ написан